По умолчанию для сортировки в GridView доступны только те поля, которые есть в таблице модели.
Задача - сортировать по вычисляемым полям. Есть туториал,
тык, но там просто достается значение через связь и запихивается в setSort в методе search:
$dataProvider->setSort([
'attributes' => [
'id',
'countryName' => [
'asc' => ['tbl_country.country_name' => SORT_ASC],
'desc' => ['tbl_country.country_name' => SORT_DESC],
'label' => 'Country Name'
]
]
]);
В моем случае значения должны высчитываться на основе связанных данных.
Решил проблему следующим образом. В методе search:
$query = Model::find();
$select = ['*', '(SELECT %MY QUERY WITH COUNT JOINS ETC%) AS calculatedField'];
$query->select($select);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'attributes'=>[
'calculatedField' => [
'asc'=>['calculatedField'=>SORT_ASC,],
'desc'=>['calculatedField'=>SORT_DESC],
],
]
]);
Есть ли какие то более элегантные решения? или в самом GridView что то для этого есть?