#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. Эй, это сработало, спасибо. Вы не знаете, могу ли я пометить два ответа как правильные?