Страница 1 из 1
Сортировка gridview по вычисляемому полю не связанному с таблицей
Добавлено: 2018.06.13, 00:53
louisvuitton
Здравствуйте,
Добавил в модель кастомный атрибут megasum - некое вычисляемое число и представим что оно не связано с табличными полями.
Можно ли сделать по нему сортировку для GridView?
Ведь сортировка это по сути ORDER BY для запроса...
Если вопрос не понятен могу уточнить что нибудь.
Re: Сортировка gridview по вычисляемому полю не связанному с таблицей
Добавлено: 2018.06.13, 02:21
louisvuitton
Не получается..
Если добавляю 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 которого в таблице нет.
Re: Сортировка gridview по вычисляемому полю не связанному с таблицей
Добавлено: 2018.06.13, 03:22
Dominus
Re: Сортировка gridview по вычисляемому полю не связанному с таблицей
Добавлено: 2018.06.13, 12:39
andku83
Код: Выделить всё
$query = Points::find()->select([Points::tableName().'.*', 'megasum' => new \yii\db\Expression('your-db-logik')]);
а после уже ваш megasum-order