Yii2 как вывести динамические названия и количество полей в GridView?
Вопрос у меня немного странный и даже запутанный, но постараюсь описать более понятно.
У меня есть две таблицы: user и table_temp.
Данные из user идут как строка, данные из table_temp идут как колонки.
Так вот, количество колонок заранее неизвестно. Также как и возможные названия. Пользователь сам будет выбирать, сколько колонок ему нужно. (как пример: строка пользователь и колонка с "датой" которая показывает, на какую сумму купил пользователь в эту дату).
Внутри модели формирую количество колонок с датой:
$baseTime = (new DateTime(date("Y-m-d")))->modify('-3 day');
for ($i=0; $i<5; $i++){
$array_date[$i] = $baseTime->modify('+1 day')->format('Y-m-d');
}
Далее начинаются мои странности:
for ($i=0; $i<count($array_date); $i++){
$sql = "(SELECT `temp` FROM `table_temp` WHERE (user_id=user.id) AND (`table_temp`.`date`='$array_date[$i]'))
AS `date$i`";
if ($i<count($array_date)-1){
$string = $string.$sql.", ";
}else{
$string = $string.$sql;
}
}
Ну и "добиваю" логику самим получившимся запросом:
$query = UserAll::find()
->select(['id','login', ''.$string.'']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
В итоге получается "красивый" запрос с кучей вложенных данных, и неопределенным количеством колонок:
SELECT `id`, `login`, (SELECT `temp` FROM `table_temp` WHERE (user_id=user.id) AND (`table_temp`.`date`='2020-11-29'))
AS `date0`, (SELECT `temp` FROM `table_temp` WHERE (user_id=user.id) AND (`table_temp`.`date`='2020-11-30'))
AS `date1`, (SELECT `temp` FROM `table_temp` WHERE (user_id=user.id) AND (`table_temp`.`date`='2020-12-01'))
AS `date2`, (SELECT `temp` FROM `table_temp` WHERE (user_id=user.id) AND (`table_temp`.`date`='2020-12-02'))
AS `date3`, (SELECT `temp` FROM `table_temp` WHERE (user_id=user.id) AND (`table_temp`.`date`='2020-12-03'))
AS `date4` FROM `user` LIMIT 20
Все у меня хорошо, если я заранее в модели определю колонки и их названия (а ведь могут быть 30, и хотелось бы также динамические названия: название колонки как дата):
public $date0;
public $date1;
public $date2;
public $date3;
public $date4;
И далее уже вывод информации:
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'formatter' => ['class' => 'yii\i18n\Formatter','nullDisplay' => ''],
'columns' => [
['class' => 'yii\grid\SerialColumn'],
['label'=>'Какая-то дата',
'value' => function($model, $key, $index, $grid){
return !empty($model->date1) ? $model->date1 : '-';
},
'format'=>'raw'
],
['label'=>'Какая-то дата',
'value' => function($model, $key, $index, $grid){
return !empty($model->date2) ? $model->date2 : '-';
},
'format'=>'raw'
],
],
]);
Чего я хочу добиться:
- Количество колонок ограничено максимальным количеством дней (30-31). Соответственно каким-то образом, в
GridViewнужно выводить именно то количество колонок, сколько запросил пользователь (за 3, 5 или 20 дней). ВнутриGridViewкак я понял невозможно пройтись циклом, а значит нужно будет описать все 30 возможных колонок? - Хотелось бы использовать название колонок не как
AS date0аAS 25.11.2020(если такое возможно). Чтобы понимать, что данные именно за конкретную дату.