Laravel使用GroupBy

时间:2014-12-17 08:22:58

标签: php laravel laravel-4

我正在尝试按cat_id对表格中的数据进行分组,并将结果转换为JSON。

表格结构

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。我在哪里做错了?

2 个答案:

答案 0 :(得分:4)

不幸的是groupBy不能像这样工作。它更像是SQL GROUP BY(实际上它就是它在后台的作用......)

我认为您的错误来自于它不知道如何处理nameid,因为您始终需要使用GROUP BY的汇总字段。

现在,您可以了解如何实现目标。我假设您已设置CategoryPost之间的关系。有点像这样:

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

然后你就可以:

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

并且您获得包含其posts的所有类别。 toJson()也应该没有问题。

答案 1 :(得分: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":
    ...
}