Разделите коллекцию красноречивых на несколько массивов на основе имени свойства

#php #laravel #laravel-charts

Вопрос:

Я создаю график с помощью диаграмм Laravel и получаю столбцы (периоды времени) и набор данных из красноречивого запроса.

Мой запрос возвращает массив, подобный следующему:

Период Сумма
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);
 

Есть ли «более родной» способ сделать это?

Комментарии:

1. Какую версию Laravel вы используете?

2. Может быть, я что-то упускаю. Где красноречивый вопрос?

3. @Rwd вы правильно предположили, 5.4.

4. @Bennett Извините, мои имена переменных были не самыми лучшими, так как это был еще только локальный тест. но запрос выполняется в функции getData. Его результатом является таблица в квестоине

Ответ №1:

Предполагая, что вы используете Laravel >=5.4, одним из вариантов было бы использовать >сообщения более высокого порядка с коллекциями, например

 $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());
 

Комментарии:

1. Почему бы просто не использовать $form_data->pluck('period') вместо $form_data->map->period того, что было бы более интуитивно понятным?

2. @shaedrich Это очень хорошая мысль! Я искренне не знаю, почему я об этом не подумал. Поскольку похоже, что методы диаграммы принимают только массив, оператору все равно нужно будет вызвать toArray() .

3. Конечно, это работает и с отвагой. Держу пари, что, поскольку pluck, вероятно, может быть просто сокращением для карты, это всего лишь две стороны одной медали. Благодаря вам сегодня я узнал о методах сбора более высокого порядка в Laravel 🙂

Ответ №2:

Вы могли бы использовать 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) работает с простыми объектами, массивами и даже коллекциями и возвращает массив. Он находится в фреймворке с версии 5.5.

Комментарии:

1. Эй, это сработало, спасибо. Вы не знаете, могу ли я пометить два ответа как правильные?