列值作为索引以生成2级集合

时间:2018-09-28 05:56:00

标签: laravel laravel-5 indexing group-by eloquent

我正在尝试获取一个具有索引作为列值的集合。 第一层将具有product_id作为索引,第二层将具有stock_date

$data = Model::select('column1', 'product_id', 'stock_date')
                         ->where('some condition')
                         ->get();

$data = collect($data)->groupBy('product_id');

使用上面的代码,我得到了以product_id作为索引的集合。

我需要用stock_date索引的每个产品的数据

例如,如果对于product_id-1,我有多条记录,我尝试过

$product_details = collect($data[1])->groupBy('stock_date');

但是它不会进一步stock_date索引记录。

需要帮助,以stock_date为它们编制索引。

2 个答案:

答案 0 :(得分:1)

您是说这些记录是按stock_date嵌套的,

然后将product_id嵌套stock_date

如果是,请尝试以下操作,collect()方法使所有嵌套记录成为集合,您无需再次使用collect()

$data = Model::select('column1', 'product_id', 'stock_date')
                     ->where('some condition')
                     ->get();

$data = collect($data)->groupBy('product_id');

$nested_products = [];
foreach($data as $product_id => $items) {
    $nested_products []= $items->groupBy('stock_date');
}

或者您可以尝试以下行,它更优雅:

collect($data)->groupBy('product_id')->transform(function($item, $k) { return $item->groupBy('stock_date');})

答案 1 :(得分:1)

可能的解决方案。

// first index grouped by product_id
$original = Model::select('column1', 'product_id', 'stock_date')
                         ->where('some condition')
                         ->get()
                         ->groupBy->product_id;

$final = collect();

// iterate through each group and
// group inner collection with 'stock_date'
// and put them back in an collecion
foreach($original as $key => $value) {

    $final->put($key, $value->groupBy->stock_date);

}