假设我有以下MySQL表来表示价格手册,项目及它们之间的关系:
item - item_id|name|...etc
pricebook - pricebook_id|name|...etc
以及以下pivot table
pricebook_item - pricebook_id|item_id|price|...etc
我有相关的Eloquent模型:Pricebook
,Item
和名为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解决方案。
答案 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
)