Grid, DataProvider, SearchModel, etc

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Grid, DataProvider, SearchModel, etc

Сообщение fly2k » 2015.10.13, 21:49

Ку!

Вопросы возникают давно, так или иначе рашал до сих пор, но имхо так и не нашёл(узнал) элегантного решения.

Как максимально быстро сделать сортировку по реф.полю? То есть в гриде можно указать, например, '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;
    }
 
и в гриде пишу 'stats.visits' и тд... но без сортировки :(

Подозреваю, что надо как то сёрч модель расширять или дополнительную создавать. Забить на сёрч модели и юзать SqlDataProvider? Тогда нет модели и row(напр. в каллбеках столбца грида) будет массивом? Подскажите как кто делает? Должно быть какое то красивое решение, это ж Йиии :D

Спасибо!
// Yii2Rulez!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Grid, DataProvider, SearchModel, etc

Сообщение zelenin » 2015.10.13, 23:29

fly2k писал(а):Как максимально быстро сделать сортировку по реф.полю? То есть в гриде можно указать, например, 'user.username' и, если есть отношение 'user' он с него возьмет свойство 'username'. Однако сортировки нет! :( И оно понятно, ибо в сёрчмодели нет такого поля в запросе и эти значения получаются путём доп.запроса на каждую строку грида. В идеале, хотелось бы чтобы был один запрос с джойном скольки угодно таблиц. Но не оч. понятно как его умещать в существующую модель.
https://www.google.com/search?q=yii2+re ... 8&oe=utf-8
fly2k писал(а):Второй момент похожий, но про агрегатные функции. То есть, тоже, я бы делал в SQL одним запросом с группировкой и sum. Например, есть две таблицы/модели:
user
* id
* username
...еще какие то поля...

user_stats
* datetime // timestamp времени статсов
* user_id // ссылка на юзера
* visits // пример каких то статсов по юзеру
...еще какие то статсы...

user_stats - по времени еще размазаны, так что получить visits по юзеру можно с помощью запроса SELECT SUM(visits) FROM user_stats WHERE user_id=...
private $sum;
public function getSum();

Ответить