Ларавель упорядочивает с помощью postgres

#laravel #postgresql

Вопрос:

Я работаю с Laravel и postgres. У меня есть код:

 $users->orderBy(DB::raw("FIELD(status, $orderedStatuses)"));
 

После запуска я получаю ошибку: Неопределенная функция FIELD() в postgres. Как я могу решить эту проблему?

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

1. У Postgres нет FIELD функции (она существует только в MySQL). Вы можете ORDER BY использовать CASE выражение всех значений статуса.

Ответ №1:

Проблема в том, что вторые последующие параметры FIELD должны быть допустимыми литералами MySQL. В этом случае, если предположить, что ваши значения статуса являются текстовыми, эти параметры должны быть допустимыми строками CSV. Вы могли бы использовать implode здесь следующее:

 $items = "'" . implode("', '", $orderedStatuses) . "'";

// ...
$users->orderBy(DB::raw("FIELD(status, $items)"));
 

Обратите внимание, что этот подход может подвергнуть вас SQL-инъекции. Предполагая, что список полей, с FIELD которыми нужно работать, относительно невелик, было бы безопаснее использовать просто ORDER BY CASE выражение.

Редактировать:

Поскольку вы используете Postgres, а не MySQL или MariaDB, вам недоступна никакая FIELD функция, даже с необработанным SQL. Итак, вместо этого вы должны упорядочить по CASE выражению, что-то вроде этого:

 ORDER BY CASE status WHEN 'start' THEN 1 WHEN 'middle' THEN 2 ELSE 3 END
 

Обновленный код Laravel:

 $orderBy = "CASE status WHEN 'start' THEN 1 WHEN 'middle' THEN 2 ELSE 3 END";
$users->orderBy(DB::raw($orderBy));
 

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

1. Проблема в том, что в postgres нет ПОЛЯ функции.

2. @Jadasdas О…не знал, что ты используешь Postgres. Я добавлю опцию для Postgres. Вы не можете использовать FIELD .