Допустим у вас есть дата провайдер:
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => ['created_at' => SORT_DESC],
],
]);
Как видим, чтобы отсортировать результаты нужно просто передать список аттрибутов по которым нужно сортировать и, опционально, указать направление сортировки. Но такой способ не работает если в сортировке нужно использовать sql-выражение.
Например, если у вас в таблице есть столбец в котором содержатся числовые данные, но он по каким-то причинам имеет строковый тип и мы не можем это поменять. В таком случае сортировка по этому столбцу не будет нам подходить, так как в результате будет что-то типо этого: 20, 2, 19, 18 и т.д.
Чтобы это исправить можно использовать приведение типа
cast(string_column as unsigned) DESC
Но в таком виде это уже нельзя передать в дата провайдер. Обходной путь, который я использовал, это объект $query:
$dataProvider->query->addOrderBy(new Expression('cast(string_column as unsigned) DESC'));