Laravel orderByRaw массив ID пользователя с привязкой
Итак, на моем сервере есть сценарий, в котором я хочу передать массив идентификаторов на мой сервер Laravel, чтобы получить список пользователей. В то же время я хочу, чтобы возвращаемые результаты запроса к базе данных также сохраняли тот же порядок, что и массив параметров ID, которые я передал.
У меня есть следующее, которое в настоящее время работает:
$strIDs = $request->input('user_ids');
$u_ids = explode(",",$strIDs);
$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderByRaw(DB::raw("FIELD(user_id, $strIDs)"))->get();
Но я понимаю, что есть что-то, называемое SQL Injection Attack, и рекомендуется сделать так, чтобы параметры этого оператора SQL связывались с переменными для защиты от этих проблем.
После некоторых других поисков я попробовал следующее, но синтаксис неправильный:
$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderByRaw(DB::raw("FIELD(user_id, ':values')", ['values' => $strIDs]))->get();
Кто-нибудь может увидеть, что я сделал не так?
2 ответа
Если вы используете Laravel 5, попробуйте использовать orderBy
У orderBy есть параметр для выбора Descend vs Ascendent, в вашем случае вы должны использовать:
$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderBy('user_id', 'ASC')->get();
пример
Ваш вклад: [13,87,29]
Если вы используете ASC ->orderBy('user_id', 'ASC')
Выход будет: [13,29,87]
Если вы используете DESC ->orderBy('user_id', 'DESC')
Выход будет: [87,29,13]
Если вы хотите не допустить внедрения SQL-кода в свое приложение, вам следует использовать подготовленные операторы. Кроме того, нет необходимости использовать необработанные запросы Laravel, поскольку Laravel имеет внутреннюю функцию для этих простых запросов и автоматически выполняет подготовку и привязку для вас.
Просто используйте:
$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderBy('user_id')->get();
Это предотвратит ваше приложение от SQL инъекций. Надеюсь, я ответил на ваш вопрос.