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'
        ],
    ],
]);

Чего я хочу добиться:

  1. Количество колонок ограничено максимальным количеством дней (30-31). Соответственно каким-то образом, в GridView нужно выводить именно то количество колонок, сколько запросил пользователь (за 3, 5 или 20 дней). Внутри GridView как я понял невозможно пройтись циклом, а значит нужно будет описать все 30 возможных колонок?
  2. Хотелось бы использовать название колонок не как AS date0 а AS 25.11.2020 (если такое возможно). Чтобы понимать, что данные именно за конкретную дату.

Ответы (0 шт):