Laravel - Group By&密钥一起

时间:2016-08-02 01:59:36

标签: mysql laravel group-by eloquent

假设我有以下MySQL表来表示价格手册,项目及它们之间的关系:

item - item_id|name|...etc
pricebook - pricebook_id|name|...etc

以及以下pivot table

pricebook_item - pricebook_id|item_id|price|...etc

我有相关的Eloquent模型:PricebookItem和名为PricebookData的存储库,以检索必要的信息。

PricebookData存储库中,我需要按价格手册ID分组价格手册数据,然后按item_id键入,以方便客户端访问。

如果我这样做:

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

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

pricebookData: {1: [{}, {}, {}...], 2: [{}, {}, {}...]}

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

 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]

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

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;

我正在努力寻找一种纯粹优雅的Eloquent / Query Builder解决方案。

1 个答案:

答案 0 :(得分:11)

我认为你想要的是

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

您首先按价格组分组,然后每个Pricebook子集由item_id键入。

,你走在正确的轨道上
Pricebook::all()->keyBy('item_id')->groupBy('pricebook_id');

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

更新

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

groupBy第二个参数$preserveKeys