Возвращение Laravel сгруппировано много ко многим отношениям

Как в этом сценарии вернуть коллекцию сгруппированного набора данных в отношении ManytoMany?

Вот образец того, какой набор данных я хочу вернуть

Возвращение Laravel сгруппировано много ко многим отношениям

Итак, давайте возьмем фавориты в качестве жанров, и выделенная дата - это 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');
```

Я хочу сгруппировать набор данных по названиям жанров, зная, что отношение жанров также является набором жанров.

эй, откуда берется $ collection?

Colin Barstow 23.04.2018 00:53

Ой, извините, я хотел назначить возвращенный набор данных переменной коллекции.

samtoya 23.04.2018 00:54

Вы, вероятно, захотите также загрузить жанры с Video::with('genres')->all();.

DevK 23.04.2018 00:55

Ага! У меня уже есть загруженный набор данных, я хочу сгруппировать возвращенный набор данных в следующем формате: "Блюз": [{"name": "Блюз"}, {"name": "Блюз"},], "Хип-хоп" : [{"name": "Блюз"}]

samtoya 23.04.2018 00:56

Отредактируйте свой вопрос и добавьте желаемый результат. Возможно, вы захотите превратить запрос в что-то вроде этого: $genres = Genre::with('videos')->get()

DevK 23.04.2018 00:58

Не во всех жанрах есть видео, когда я запрашиваю все видео, в результирующем наборе указываются жанры, в которых есть видео. Вот почему я хочу сгруппировать этот набор результатов по жанрам. Я не знаю, правильно ли вы поняли мою точку зрения.

samtoya 23.04.2018 01:05

Вы можете добавить has(..) в запрос: $genres = Genre::has('videos')->with('videos')->get()

DevK 23.04.2018 01:07

Это намного сложнее, чем кажется на первый взгляд, потому что жанры видео - это коллекция (это также причина, по которой простой groupBy('genres.name') не работает - поскольку genres не является объектом). Боюсь, вам придется написать сложную логику для группировки себя с помощью обратного вызова ->groupBy(function ($item) {..}), если вы настроены делать это с коллекциями.

DevK 23.04.2018 01:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
8
1 897
1

Ответы 1

Коллекции и построители запросов имеют много схожих функций, таких как where () groupBy () и так далее. Это приятный синтаксический сахар, но он действительно скрывает основную технологию.

  1. Если вы вызываете $ model-> videos ... как свойство, это коллекция (запрос выполнен).
  2. Если вы вызываете $ model-> videos () ... как метод, это конструктор запросов.

Итак, если вы хотите выполнить работу в 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 23.04.2018 01:09

@devk совершенно прав. Вы можете связать все это вместе. Моя многословность была просто для ясности.

Tarek Adam 23.04.2018 01:10

Это не сработает, потому что в таблице видео нет genre_id, это отношение «многие ко многим» с использованием сводной таблицы. Видео может иметь несколько жанров или один.

samtoya 23.04.2018 01:12

Или, может быть, вы хотите объединить все жанры с видео? Просто пойти на это с другой стороны?

Tarek Adam 23.04.2018 01:22

Было бы предпочтительнее использовать коллекцию.

samtoya 23.04.2018 01:22

Если вы используете коллекцию, то, возможно, проще всего добавить в вашу видеомодель жанровый слагмейкер. Тогда вы можете сгруппировать по этому. добавьте что-то подобное в класс модели Video.php. публичная функция getGenreSlugAttribute () {return implode ('-', $ this-> generes-> pluck ('name') -> flatten () -> toArray ()); } Затем вы можете Videos :: with ('genere') -> get () -> groupBy ('genre_slug');

Tarek Adam 23.04.2018 01:27

По сути, создайте свойство модели «на лету», по которому можно группировать.

Tarek Adam 23.04.2018 01:29

Наверное, захотите упорядочить жанры по имени ... Так что лучше было бы $ this-> genres () -> order By ('name') -> get-> pluck ... для согласованности слагов

Tarek Adam 23.04.2018 01:31

@TarekAdam с помощью genre_slug получил именно тот набор данных, который я хотел. Спасибо, миллиард человек.

samtoya 23.04.2018 01:44

Потрясающие! Рад это слышать! Я обновлю пост для следующего человека.

Tarek Adam 23.04.2018 01:46

Мне не удалось отсортировать или упорядочить результат по названию жанра. Есть последний совет по этому поводу?

samtoya 23.04.2018 01:47

Позвольте нам продолжить обсуждение в чате.

Tarek Adam 23.04.2018 01:47

Другие вопросы по теме