在集合上链接 groupBy?

Chaining groupBy on a collection?

我有一个具有 3 个关联的实体,其中 2 个是 parent/child,我想 groupBy 并将它们嵌套在所有 3 个上。

鉴于此实体:

(int) 0 => object(Furniture\Model\Entity\FurnitureItem) {

        'id' => (int) 155,
        'furniture_type_id' => (int) 32,
        'country' => object(Countries\Model\Entity\Country) {
             'id' => (int) 14
        },
        'furniture_types' => object(Furniture\Model\Entity\FurnitureTypes) {
            'id' => (int) 32,
            'furniture_master_types' => 
                object(Furniture\Model\Entity\FurnitureMasterTypes) {

                    'id' => (int) 142
             },
        },
}

其中 FurnitureItem 属于 FurnitureTypesFurnitureTypes 属于 FurnitureMasterTypes 以及 FurnitureItem 属于 Countries,我想格式化我的结果所以它是这样嵌套的:

FurnitureMasterTypes -> FurnitureTypes -> 国家 -> FurnitureItem

我试过 $query->groupBy('furniture_types.furniture_master_types.id') 进行第一级嵌套,但这显然改变了结果集并且 ->groupBy('{item}.furniture_types.id') 似乎没有应用第二级分组。

book 中没有嵌套分组依据的示例,所以想知道如何解决这个问题?

我想要的结果示例:

[
    '142' => [ // FurnitureMasterType
        '32' => [ // FurnitureType
           '14' => [ // Country
              object(Furniture\Model\Entity\FurnitureItem) {
                  'id' => (int) 155
              }
            ]
        ]
    ]
]

理想情况下,如果我可以重组以包含很棒的实体级信息,例如:

[
    object(Furniture\Model\Entity\FurnitureMasterTypes) {
        'id' => 142,
        'items' => [
            object(Furniture\Model\Entity\FurnitureTypes) {
               'id' => 32,
               'items' => [
                   object(Countries\Model\Entity\Country) {
                      'id' => 14,
                      'items' => [
                          object(Furniture\Model\Entity\FurnitureItem) {
                              'id' => (int) 155
                          }
                       ]
                    }
                ]
            }
        ]
    }
]

可能实际上已经找到了一种方法来做到这一点,虽然我仍然完全确认结构是 intact/right,但它似乎正在工作。

$query->formatResults(function($results) {
    return $results->groupBy('furniture_types.furniture_master_types.id')
        ->map(function($row) {
            return collection($row)->groupBy('furniture_types.id')
                ->map(function($row) {
                    return collection($row)->groupBy('country.id')->toArray();
                })->toArray();
        });
})->toArray();

关键是里面的 collection 调用 - 我发现了 here.