У меня есть таблица вопросов и таблица тегов. Я хочу получить все вопросы из тегов данного вопроса. Так, например, к данному вопросу могут быть прикреплены теги «Поездка», «Поезда» и «Культура». Я хочу быть в состоянии получить все вопросы для этих трех тегов. Хитрость, как кажется, заключается в том, что вопросы и теги имеют отношение «многие ко многим», которое в Eloquent определено как ownToMany.
Я думал о попытке объединить Коллекции вопросов, как показано ниже:
foreach ($question->tags as $tag) {
if (!isset($related)) {
$related = $tag->questions;
} else {
$related->merge($tag->questions);
}
}
Похоже, это не работает. Кажется, ничего не сливается. Я пытаюсь это правильно? Кроме того, возможно, в Eloquent есть лучший способ получить ряд строк в отношении «многие ко многим»?
Метод merge возвращает объединенную коллекцию, он не изменяет исходную коллекцию, поэтому вам нужно сделать следующее
$original = new Collection(['foo']);
$latest = new Collection(['bar']);
$merged = $original->merge($latest); // Contains foo and bar.
Применяя пример к вашему коду
$related = new Collection();
foreach ($question->tags as $tag)
{
$related = $related->merge($tag->questions);
}
merge()
метод на Collection
не изменяет коллекцию, в которой он был вызван. Он возвращает новую коллекцию с объединенными новыми данными. Вам потребуется:
$related = $related->merge($tag->questions);
Тем не менее, я думаю, что вы решаете проблему с неправильной точки зрения.
Поскольку вы ищете вопросы, которые соответствуют определенным критериям, возможно, было бы проще задавать такие вопросы. has()
а также whereHas()
методы используются для генерации запроса, основанного на существовании связанной записи.
Если вы просто искали вопросы, которые имеют какой-либо тег, вы бы использовали has()
метод. Поскольку вы ищете вопросы с определенным тегом, вы должны использовать whereHas()
добавить условие.
Итак, если вы хотите, чтобы все вопросы, имеющие хотя бы один тег с тегами «Путешествия», «Поезда» или «Культура», ваш запрос будет выглядеть так:
$questions = Question::whereHas('tags', function($q) {
$q->whereIn('name', ['Travel', 'Trains', 'Culture']);
})->get();
Если вы хотите, чтобы все вопросы содержали все три тега, ваш запрос выглядел бы так:
$questions = Question::whereHas('tags', function($q) {
$q->where('name', 'Travel');
})->whereHas('tags', function($q) {
$q->where('name', 'Trains');
})->whereHas('tags', function($q) {
$q->where('name', 'Culture');
})->get();
$users = User::all();
$associates = Associate::all();
$userAndAssociate = $users->merge($associates);
Объедините две разные красноречивые коллекции в одну, и у некоторых объектов будет один и тот же идентификатор, один перезапишет другой. Вместо этого используйте метод push () или переосмыслите свой подход к проблеме, чтобы избежать этого.
Обратитесь к сети
У меня все не работает на красноречивые коллекции, красноречивые коллекции laravel используют ключ от предметов Я думаю что вызывает проблемы слияния, вам нужно вернуть первую коллекцию в виде массива, поместить ее в новую коллекцию и затем поместить остальные в новую коллекцию;
public function getFixturesAttribute()
{
$fixtures = collect( $this->homeFixtures->all() );
$this->awayFixtures->each( function( $fixture ) use ( $fixtures ) {
$fixtures->push( $fixture );
});
return $fixtures;
}