2014-12-17 5 views
2

Я пытаюсь объединить данные в таблицу на cat_id и преобразовать результат в JSON.Использование Laravel GroupBy

Структура таблицы

id name cat_id 
1 A  2 
2 B  1  
3 C  2  
4 D  2  
5 E  3  
6 F  2  
7 G  1 

Вот код, который я попытался

$posts = Posts::groupBy('cat_id')->get(); 

return $posts->toJson(); 

Результат должен выглядеть следующим образом:

[ 
    { 
     "id": "1", //cat_id 
     "posts": [ 
      { 
       "id": "2", //user id 
       "s": "B" //name 
      }, 
      { 
       "id": "7", 
       "s": "G" 
      } 
     ] 
    }, 
    { 
     "id": "2", //cat id 
     "posts": [ 
      { 
       "id": "1", 
       "name": "A" 
      }, 
      { 
       "id": "3", 
       "name": "C" 
      }, 
      { 
       "id": "4", 
       "s": "D" 
      }, 
      { 
       "id": "6", 
       "s": "F" 
      } 
     ] 
    } 
] 

Но я получаю Call to a member function toJson() on a non-object. Где я поступаю неправильно?

+0

вы получаете результат без toJson? –

+0

@AnandPatel Я получаю результаты, но не так, как я ожидал. В запросе явно что-то не так. –

ответ

4

К сожалению, groupBy не работает. Это больше похоже на SQLs GROUP BY (на самом деле это то, что он делает в фоновом режиме ...)

Я предполагаю, что ваша ошибка возникает из-за того, что он не знает, что делать с name и id, потому что вы всегда должны агрегатные поля с GROUP BY.

Теперь вот как вы можете достичь своей цели. Я предполагаю, что вы установили связь между Category и Post. примерно так:

class Category extends Eloquent { 
    public function posts(){ 
     return $this->hasMany('Post', 'cat_id'); 
    } 
} 

Тогда вы можете сделать:

$categories = Category::with('posts')->get(); 

И вы получите все категории, содержащие его posts. toJson() должен работать без проблем.

+0

Удивительный помощник! :) –

+0

Добро пожаловать;) – lukasgeiter

1

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

$posts = Pots::all(); // fetch from the DB 

$groupedByCat = $posts->groupBy('cat_id'); // call group by on the collection 

Результат будет выглядеть следующим образом:

{ 
    "1": // cat_id 
    [ 
     { 
     "id": "5" // post data 
     ... 
     }, 
     ... 
    ], 
    "2": 
    ... 
} 
Смежные вопросы