Допустим у вас есть дата провайдер:

$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'));