Как объединить две красноречивые коллекции?

У меня есть таблица вопросов и таблица тегов. Я хочу получить все вопросы из тегов данного вопроса. Так, например, к данному вопросу могут быть прикреплены теги «Поездка», «Поезда» и «Культура». Я хочу быть в состоянии получить все вопросы для этих трех тегов. Хитрость, как кажется, заключается в том, что вопросы и теги имеют отношение «многие ко многим», которое в Eloquent определено как ownToMany.

Я думал о попытке объединить Коллекции вопросов, как показано ниже:

foreach ($question->tags as $tag) {
if (!isset($related)) {
$related = $tag->questions;
} else {
$related->merge($tag->questions);
}
}

Похоже, это не работает. Кажется, ничего не сливается. Я пытаюсь это правильно? Кроме того, возможно, в Eloquent есть лучший способ получить ряд строк в отношении «многие ко многим»?

40

Решение

Метод 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);
}
79

Другие решения

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();
16

$users = User::all();
$associates = Associate::all();

$userAndAssociate = $users->merge($associates);
5

Объедините две разные красноречивые коллекции в одну, и у некоторых объектов будет один и тот же идентификатор, один перезапишет другой. Вместо этого используйте метод push () или переосмыслите свой подход к проблеме, чтобы избежать этого.
Обратитесь к сети

0

У меня все не работает на красноречивые коллекции, красноречивые коллекции laravel используют ключ от предметов Я думаю что вызывает проблемы слияния, вам нужно вернуть первую коллекцию в виде массива, поместить ее в новую коллекцию и затем поместить остальные в новую коллекцию;

public function getFixturesAttribute()
{
$fixtures = collect( $this->homeFixtures->all() );
$this->awayFixtures->each( function( $fixture ) use ( $fixtures ) {
$fixtures->push( $fixture );
});
return $fixtures;
}
0
По вопросам рекламы [email protected]