Поиск по этому блогу

суббота, 4 февраля 2017 г.

Yii2 query builder order by function

Время от времени нам требуется сортировать выборку по функции в mysql.
Допустим нам нужно отсортировать список матчей по статусам. SQL-запрос будет выглядеть так:
SELECT id, status FROM matches ORDER BY FIELD(status, 0, 10, 20, 40, 30) 
 Давайте попробуем сделать этот же запрос используя yii2
$query = Match::find()->orderBy('FIELD(`status`, 0, 10, 20, 40, 30)');
И мы будем неприятно удивлены. При нормализации запроса цифровые статусы будут преобразованы. Если мы распечатаем запрос то увидим следующее:
SELECT * FROM `matches` ORDER BY FIELD(`status`, `0`, `1`, `2`, `3`, `30)` 
Все не совсем так, как мы планировали. Давайте заглянем в исходники. Как мы видим чтобы сделать как нам нужно не слишком сложно. Меняем использование билдера на следующее:
$query = Match::find()->orderBy(['FIELD(`status`, 0, 10, 20, 40, 30)' => SORT_ASC])
На этом все заработает. 

Комментариев нет:

Отправить комментарий

Количество·просмотров