У меня есть таблица вопросов и таблица тегов. Я хочу получить все вопросы из тегов заданных вопросов. Так, например, у меня могут быть теги «Путешествия», «Поезда» и «Культура», связанные с данным вопросом. Я хочу получить все вопросы для этих трех тегов. Кажется, сложно, что отношения вопросов и тегов – это многие-ко-многим, определенные в Eloquent as whichToMany.
Я думал о попытке объединить вопросы Коллекции, как показано ниже:
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();
Слияние двух разных красноречивых коллекций в один, а некоторые объекты имеют один и тот же идентификатор, один будет перезаписывать другой. Используйте метод push () или переосмыслите свой подход к проблеме, чтобы этого избежать. См. Веб-сайт