Laravel 中的 Groupby 将分组项保留在对象中

Fer*_*nir 2 php group-by laravel

是的,不确定是我做错了什么还是 Laravel 中 Illuminate\Database 的问题。

我的代码:

$sth = Insect::leftJoin('types', 'types.id', '=', 'families.type_id')
            ->select('types.name as types','families.id','families.name')
            ->get()
            ->groupBy('types');
Run Code Online (Sandbox Code Playgroud)

groupBy之前的结果是:

[
{
    "types": "moths",
    "id": 1,
    "name": "Bombycidae"
},
{
    "types": "moths",
    "id": 2,
    "name": "Brahmaeidae"
},
{
    "types": "moths",
    "id": 3,
    "name": "Cossidae"
},
{
    "types": "larvas",
    "id": 6,
    "name": "test"
}]
Run Code Online (Sandbox Code Playgroud)

但对于 groupBy:

{
"moths": [
    {
        "types": "moths",
        "id": 1,
        "name": "Bombycidae"
    },
    {
        "types": "moths",
        "id": 2,
        "name": "Brahmaeidae"
    },
    {
        "types": "moths",
        "id": 3,
        "name": "Cossidae"
    }
],
"larvas": [
    {
        "types": "larvas",
        "id": 6,
        "name": "test"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我想摆脱对象中的这种类型......

有任何想法吗?

apo*_*fos 6

好吧,首先你要做的是调用groupBy结果集合,这与命名非常糟糕的 MySQL 查询子句无关GROUP BY(不相关,但值得注意)。

您可以将结果映射到您需要的内容:

 $sth = Insect::leftJoin('types', 'types.id', '=', 'families.type_id')
                    ->select('types.name as types','families.id','families.name')
                    ->get()
                    ->groupBy('types')->map(function ($group) {
                          return $group->map(function ($value) {
                                return [ "id" => $value->id, "name" => $value->name ];
                          });
                     });
Run Code Online (Sandbox Code Playgroud)