Сортировка gridview по вычисляемому полю не связанному с таблицей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
louisvuitton
Сообщения: 174
Зарегистрирован: 2014.02.16, 03:09

Сортировка gridview по вычисляемому полю не связанному с таблицей

Сообщение louisvuitton » 2018.06.13, 00:53

Здравствуйте,
Добавил в модель кастомный атрибут megasum - некое вычисляемое число и представим что оно не связано с табличными полями.
Можно ли сделать по нему сортировку для GridView?
Ведь сортировка это по сути ORDER BY для запроса...

Если вопрос не понятен могу уточнить что нибудь.

louisvuitton
Сообщения: 174
Зарегистрирован: 2014.02.16, 03:09

Re: Сортировка gridview по вычисляемому полю не связанному с таблицей

Сообщение louisvuitton » 2018.06.13, 02:21

Не получается..
Если добавляю defaultOrder в дата провайдер

Выдает предупреждение
PHP Notice – yii\base\ErrorException
Undefined index: megasum


(megasum может быть Null кстати иногда)

Но вообще я хочу чтоб заголовок таблицы gridview был кликабельный для сортировки, а не просто отсортировать 1 раз по умолчанию.

Допустим есть

Код: Выделить всё

class Points extends ActiveRecord {
    ...
    public function getMegasum()
    {
        return rand(0, 100);
    }

}

Код: Выделить всё

 
class PointsSearch extends Points {
    ...
    public $megasum;
    
    public function rules()
    {
        return [
           ['meagasum', 'safe'],
        ];
    }

  public function search($params)
    {
        $query = Points::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        // для свяанных полей работает что то вроде 
        $dataProvider->sort->attributes['balance'] = [
            'asc' => ['points_balance.balance' => SORT_ASC],
            'desc' => ['points_balance.balance' => SORT_DESC],
        ];
        // а как сделать для нетабличного поля?!

        return $dataProvider;
    }
}

на

$dataProvider->sort->attributes['megasum'] = [
'asc' => ['megasum' => SORT_ASC],
'desc' => ['megasum' => SORT_DESC],
];


выдает

Database Exception – yii\db\Exception
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'megasum' in 'order clause'

и SQL-запрос с подствленным туда в order by megasum которого в таблице нет.

Аватара пользователя
Dominus
Сообщения: 626
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Сортировка gridview по вычисляемому полю не связанному с таблицей

Сообщение Dominus » 2018.06.13, 03:22

Привет, тут посмотрите: https://yiiframework.ru/forum/viewtopic ... 19&t=34992
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!

andku83
Сообщения: 549
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Сортировка gridview по вычисляемому полю не связанному с таблицей

Сообщение andku83 » 2018.06.13, 12:39

Код: Выделить всё

$query = Points::find()->select([Points::tableName().'.*', 'megasum' => new \yii\db\Expression('your-db-logik')]);
а после уже ваш megasum-order

Ответить