#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
.