Как в этом сценарии вернуть коллекцию сгруппированного набора данных в отношении ManytoMany?
Вот образец того, какой набор данных я хочу вернуть
Итак, давайте возьмем фавориты в качестве жанров, и выделенная дата - это genres name, это тоже коллекция. Я хочу сгруппировать его на основе genres name в этой коллекции.
Моя модель:
видео
```
public function genres() {
return $this->belongsToMany(Genre::class);
}
```
Жанр
```
public function videos() {
return $this->belongsToMany(Video::class);
}
```
Я уже пробовал следующее, но не могу этого понять.
```
$videos = Video::with('genres')->all();
$collection = $videos->groupBy('genres.name');
```
Я хочу сгруппировать набор данных по названиям жанров, зная, что отношение жанров также является набором жанров.
Ой, извините, я хотел назначить возвращенный набор данных переменной коллекции.
Вы, вероятно, захотите также загрузить жанры с Video::with('genres')->all();.
Ага! У меня уже есть загруженный набор данных, я хочу сгруппировать возвращенный набор данных в следующем формате: "Блюз": [{"name": "Блюз"}, {"name": "Блюз"},], "Хип-хоп" : [{"name": "Блюз"}]
Отредактируйте свой вопрос и добавьте желаемый результат. Возможно, вы захотите превратить запрос в что-то вроде этого: $genres = Genre::with('videos')->get()
Не во всех жанрах есть видео, когда я запрашиваю все видео, в результирующем наборе указываются жанры, в которых есть видео. Вот почему я хочу сгруппировать этот набор результатов по жанрам. Я не знаю, правильно ли вы поняли мою точку зрения.
Вы можете добавить has(..) в запрос: $genres = Genre::has('videos')->with('videos')->get()
Это намного сложнее, чем кажется на первый взгляд, потому что жанры видео - это коллекция (это также причина, по которой простой groupBy('genres.name') не работает - поскольку genres не является объектом). Боюсь, вам придется написать сложную логику для группировки себя с помощью обратного вызова ->groupBy(function ($item) {..}), если вы настроены делать это с коллекциями.






Коллекции и построители запросов имеют много схожих функций, таких как where () groupBy () и так далее. Это приятный синтаксический сахар, но он действительно скрывает основную технологию.
Итак, если вы хотите выполнить работу в sql, вы можете сделать что-то вроде ...
$video_query_builder = Video::with('genere');
$video_query_builder->groupBy('genere_id');
$result = $video_query_builder->get();
Вы можете связать все это вместе красиво и аккуратно, как было предложено в комментариях ... вот так:
$result = Video::with('genere')
->groupBy('genere_id')
->get();
Это сделало бы то же самое: $result = Video::with('genre')->groupBy('genre_id')->get(). Не уверен, что это сработает, просто хотел упомянуть, что нет причин для трех строк.
@devk совершенно прав. Вы можете связать все это вместе. Моя многословность была просто для ясности.
Это не сработает, потому что в таблице видео нет genre_id, это отношение «многие ко многим» с использованием сводной таблицы. Видео может иметь несколько жанров или один.
Или, может быть, вы хотите объединить все жанры с видео? Просто пойти на это с другой стороны?
Было бы предпочтительнее использовать коллекцию.
Если вы используете коллекцию, то, возможно, проще всего добавить в вашу видеомодель жанровый слагмейкер. Тогда вы можете сгруппировать по этому. добавьте что-то подобное в класс модели Video.php. публичная функция getGenreSlugAttribute () {return implode ('-', $ this-> generes-> pluck ('name') -> flatten () -> toArray ()); } Затем вы можете Videos :: with ('genere') -> get () -> groupBy ('genre_slug');
По сути, создайте свойство модели «на лету», по которому можно группировать.
Наверное, захотите упорядочить жанры по имени ... Так что лучше было бы $ this-> genres () -> order By ('name') -> get-> pluck ... для согласованности слагов
@TarekAdam с помощью genre_slug получил именно тот набор данных, который я хотел. Спасибо, миллиард человек.
Потрясающие! Рад это слышать! Я обновлю пост для следующего человека.
Мне не удалось отсортировать или упорядочить результат по названию жанра. Есть последний совет по этому поводу?
Позвольте нам продолжить обсуждение в чате.
эй, откуда берется $ collection?