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 инъекций. Надеюсь, я ответил на ваш вопрос.

Другие вопросы по тегам