根据 属性 名称将 Eloquent 集合拆分为多个数组

Split Eloquent collection into multiple arrays based on property name

我正在使用 Laravel 图表创建图表,并且我正在从 Eloquent 查询中获取列(时间段)和数据集。

我的查询 returns 一个数组,如下所示:

Period Amount
01/21 200.00
02/21 150.00
03/21 175.00
... ...

Laravel 图表要求您输入图表标签数组和图表值数组。目前,我以这种方式创建和填充数组:

//the function getData returns the table above as an Eloquent Collection
$form_data = $this->getData($initial_date, $final_date, $product_list, $group);
$labels = [];
$dataset = [];
foreach ($form_data as $data) {
    array_push($labels, $data->period);
    array_push($dataset, $data->amount);
}
$chart->labels($labels);
$chart->dataset('My dataset', 'line', $dataset);

是否有“更原生”的方式来做到这一点?

假设您使用的是 Laravel >=5.4,一种选择是将 Higher order messages 用于集合,例如

$form_data->map->period->toArray()

这意味着您的代码将类似于:

$form_data = $this->getData($initial_date, $final_date, $product_list, $group);

$chart->labels($form_data->map->period->toArray());
$chart->dataset('My dataset', 'line', $form_data->map->amount->toArray());

或者,(如评论中所述)您也可以使用 pluck:

$form_data = $this->getData($initial_date, $final_date, $product_list, $group);

$chart->labels($form_data->pluck('period')->toArray());
$chart->dataset('My dataset', 'line', $form_data->pluck('amount')->toArray());

如果你想用更少的行做同样的事情,你可以使用 data_get()

$form_data = $this->getData($initial_date, $final_date, $product_list, $group);

$chart->labels(data_get($form_data, '*.period');
$chart->dataset('My dataset', 'line', data_get($form_data, '*.amount'));

data_get($target, $key, $default = null) 适用于简单对象、数组甚至集合,returns 数组。 5.5版本开始在框架中