我正在尝试按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
。我在哪里做错了?
答案 0 :(得分:4)
不幸的是groupBy
不能像这样工作。它更像是SQL 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()
也应该没有问题。
答案 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":
...
}