Вопросы возникают давно, так или иначе рашал до сих пор, но имхо так и не нашёл(узнал) элегантного решения.
Как максимально быстро сделать сортировку по реф.полю? То есть в гриде можно указать, например, 'user.username' и, если есть отношение 'user' он с него возьмет свойство 'username'. Однако сортировки нет! И оно понятно, ибо в сёрчмодели нет такого поля в запросе и эти значения получаются путём доп.запроса на каждую строку грида. В идеале, хотелось бы чтобы был один запрос с джойном скольки угодно таблиц. Но не оч. понятно как его умещать в существующую модель.
Второй момент похожий, но про агрегатные функции. То есть, тоже, я бы делал в SQL одним запросом с группировкой и sum. Например, есть две таблицы/модели:
user
* id
* username
...еще какие то поля...
user_stats
* datetime // timestamp времени статсов
* user_id // ссылка на юзера
* visits // пример каких то статсов по юзеру
...еще какие то статсы...
user_stats - по времени еще размазаны, так что получить visits по юзеру можно с помощью запроса SELECT SUM(visits) FROM user_stats WHERE user_id=...
Ну и вот захотел я в индексе CRUD'а для юзеров вывести колонки статсов(visits, ...), да еще бы с сортировкой?
Пока сделал геттер с кешированием в приватной переменной(чтобы хоть на каждое поле по запросу не делал):
Код: Выделить всё
public function getStats()
{
if (!isset($this->_stats)) {
$this->_stats = $this->getUserStats()->select([
'visits' => 'SUM(`visits`)',
'registered' => 'SUM(`registered`)',
'active' => 'SUM(`active`)',
'paid' => 'SUM(`paid`)',
])->one();
}
return $this->_stats;
}
Подозреваю, что надо как то сёрч модель расширять или дополнительную создавать. Забить на сёрч модели и юзать SqlDataProvider? Тогда нет модели и row(напр. в каллбеках столбца грида) будет массивом? Подскажите как кто делает? Должно быть какое то красивое решение, это ж Йиии
Спасибо!