Laravel извлекает массив массивов с помощью groupBy

#php #mysql #laravel #eloquent

#php #mysql #laravel #красноречивый

Вопрос:

У меня есть таблица Laravel posts с несколькими categories . Как я могу получить все posts сгруппированные по categories ? Я делал что-то вроде Post::where('userID', 1)->groupBy('categoryID') . Но это вернуло только плоский массив именованных массивов, подобных этому:

 [1 => ['title'=>'title 1'], 2 => ['title'=>'title3']]
  

Как я могу вернуть массив массивов, подобных этому:

 [1 => [['title'=>'title 1'], ['title' => 'title 2], 2 => [['title'=>'title 3']]]
  

Обновить:
В настоящее время я выполняю объединение, а затем использую коллекцию Laravel для ее сортировки в php:

    Post::join('categories', ....).where('userID', 1)->get()->groupBy('categoryID');
  

Я могу получить то, что хочу, но интересно, есть ли лучший способ?

Ответ №1:

Возможно, вам понадобится это:

 $catsWithPosts = Category::with(array('posts' => function($query){
    $query->select('title')->where('userID', 1);
}))->get();
  

Предполагается, что вы объявили правильную взаимосвязь между Post и Category моделью.

Комментарии:

1. Спасибо, но userID он включен posts . Похоже, это не работает.

2. Какая таблица содержит category_id ?

3. Кажется, это работает. Но, глядя на документацию, мне интересно, выполняю ли я n запросов в зависимости от количества моих категорий? laravel.com/docs/eloquent

4. Нет, это не n запросы, потому что он использует метод быстрой загрузки.