Intereting Posts
Могу ли я показать список контактов в категории, на странице «Список всех категорий контактов» в Joomla? Как заменить класс Laravel Builder Можете ли вы получить идентификатор группы интересов MailChimp без использования API? Конфликт jQuery! Отображает белый экран на странице POST EDIT для WordPress Регулярное выравнивание или preg_replace пробел, включая вкладки и новые строки .htaccess throws 403 Создание проекта быстрого запуска Forbidden / Zend Framework (Mac OS X 10.6.5) Как динамически управлять ролями | разрешениями в Symfony2: ограничить функции динамическими ролями Включение / установка расширения Curl (OSX Server / PHP 5.3.3 / Apache 2.2) Может ли объект JSON, возвращаемый PHP, содержать объект даты Заставлять пользователей выйти из системы, покидая мой веб-сайт php? отправка данных таблицы html в таблицу mysql Vimeo Advanced API – Как подключиться через Oauth? Почему apc_store () возвращает false? Почему Google индексирует дружественный URL-адрес, смешанный с дефисами и% 20? Эффективность включения файлов функций (в PHP)

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

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

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

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

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

Solutions Collecting From Web of "Как объединить две красноречивые коллекции?"

Метод 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 () или переосмыслите свой подход к проблеме, чтобы этого избежать. См. Веб-сайт