У меня есть таблица вопросов и таблица тегов. Я хочу получить все вопросы из тегов данного вопроса. Так, например, у меня могут быть теги «Путешествие», «Поезда» и «Культура» к данному вопросу. Я хочу получить все вопросы по этим трем тегам. Сложность, как кажется, в том, что отношения вопросов и тегов - это отношения «многие ко многим», определенные в Eloquent как ownToMany.
Я подумал о попытке объединить Коллекции вопросов, как показано ниже:
foreach ($question->tags as $tag) {
if (!isset($related)) {
$related = $tag->questions;
} else {
$related->merge($tag->questions);
}
}
Хотя, похоже, это не работает. Не похоже ничего объединить. Правильно ли я пытаюсь это сделать? Кроме того, возможно, есть лучший способ получить строку строк в отношении «многие ко многим» в Eloquent?
php
laravel
eloquent
laravel-collection
Мартын
источник
источник
with
не поможет. Это то,whereHas
что нужно - как в ответе ниже.Ответы:
Метод слияния возвращает объединенную коллекцию, он не изменяет исходную коллекцию, поэтому вам необходимо сделать следующее
$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); }
источник
getKey
чтобы результаты слияния, такModel::all()->merge(Model::all())->count() === Model::all()->count()
merge()
Метод наCollection
не изменяет коллекцию , на которой он был назван. Он возвращает новую коллекцию с объединенными новыми данными. Вам потребуется:Однако я думаю, что вы подходите к проблеме не с той точки зрения.
Поскольку вы ищете вопросы, отвечающие определенным критериям, вероятно, будет проще запросить таким образом.
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 () или переосмыслите свой подход к проблеме, чтобы избежать этого. Обратитесь к Интернету
источник
Все не работают для меня в красноречивых коллекциях , красноречивые коллекции laravel используют ключ из элементов, которые, как я думаю, вызывают проблемы слияния, вам нужно вернуть первую коллекцию в виде массива, поместить ее в новую коллекцию, а затем вставить остальные в новая коллекция;
public function getFixturesAttribute() { $fixtures = collect( $this->homeFixtures->all() ); $this->awayFixtures->each( function( $fixture ) use ( $fixtures ) { $fixtures->push( $fixture ); }); return $fixtures; }
источник
Создание новой базовой коллекции для каждой красноречивой коллекции, слияние работает для меня.
В этом случае нет конфлитов по его первичным ключам.
источник