Laravel - Group By&Key一起来

dev*_*ev7 2 mysql group-by laravel eloquent

假设我有以下MySQL表来表示pricebooks,items及它们之间的关系:

item - item_id|name|...etc
pricebook - pricebook_id|name|...etc
Run Code Online (Sandbox Code Playgroud)

和以下 pivot table

pricebook_item - pricebook_id|item_id|price|...etc
Run Code Online (Sandbox Code Playgroud)

我有相关雄辩型号:Pricebook,Item和库命名PricebookData,以获取必要的信息.

PricebookData存储库中,我需要按价格手册ID分组价格手册数据,然后通过item_id键入,以便在客户端轻松访问.

如果我做:

Pricebook::all()->groupBy('pricebook_id');
Run Code Online (Sandbox Code Playgroud)

我得到的信息按照pricebook_id每个价格手册中的内容分组,键是简单的数字索引(它以js数组的形式到达),而不是实际的product_id.因此,当返回到客户端Javascript时,结果如下:

pricebookData: {1: [{}, {}, {}...], 2: [{}, {}, {}...]}
Run Code Online (Sandbox Code Playgroud)

价格作为数组到达的问题是,如果不迭代数组,我就无法轻松访问它.理想情况下,我可以收到它:

 pricebookData: {1: {1001:{}, 1002: {}, 1003: {}}, 2: {1001:{}, 1002: {}, 1003: {}}}
//where 1001, 1002, 1003 are actual item ids
//with this result format, I could simply do var price = pricebookData[1][1001]
Run Code Online (Sandbox Code Playgroud)

我也试过以下但没有成功:

Pricebook::all()->keyBy('item_id')->groupBy('pricebook_id');

我试图避免的相当于:

$prices = Pricebook::all();
$priceData = [];
foreach ($prices as $price) 
{
   if (!isset($priceData[$price->pricebook_id])) 
   {
      $priceData[$price->pricebook_id] = [];
   }
   $priceData[$price->pricebook_id][$price->item_id] = $price;
}
return $priceData;
Run Code Online (Sandbox Code Playgroud)

我试图找到一个纯粹优雅的Eloquent/Query Builder解决方案.

ale*_*ino 16

我想你想要的是什么

Pricebook::all()
    ->groupBy('pricebook_id')
    ->map(function ($pb) { return $pb->keyBy('item_id'); });
Run Code Online (Sandbox Code Playgroud)

您首先按Pricebook分组,然后每个Pricebook子集由item_id键入.你走在正确的轨道上

Pricebook::all()->keyBy('item_id')->groupBy('pricebook_id');
Run Code Online (Sandbox Code Playgroud)

不幸的是,在实施时,groupBy重置以前的密钥.

更新:

Pricebook::all()->keyBy('item_id')->groupBy('pricebook_id', true);
Run Code Online (Sandbox Code Playgroud)

(groupBy第二个参数$preserveKeys)