Значение столбца в качестве индекса для создания двухуровневой коллекции - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь получить коллекцию с индексом в качестве значения столбца.Первый уровень будет иметь 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 голосов
/ 28 сентября 2018

возможное решение.

// 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);

}
0 голосов
/ 28 сентября 2018

Вы подразумеваете, что эти записи вложены в stock_date,

, а затем в stock_dates вложены product_id

Если это так, попробуйте это ниже, метод 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');})
...