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)
| 归档时间: |
|
| 查看次数: |
7440 次 |
| 最近记录: |