Связывание параметров Eloquent с DB :: raw, но не с DB :: select (DB: raw ()) - PullRequest
0 голосов
/ 17 июня 2020

У меня есть панель поиска пользователей, которая позволяет клиентам искать пользователей по имени, имени пользователя или имени роли пользователя (например, admin, manager и т. Д. c).

В моем запросе я использую DB :: raw для объединения следующих полей: user.forename + user.surname + role.name + user.username, чтобы пользователь мог искать в любом из четырех полей и мог искать John или Smith или John Smith.

в моем запросе orWhere , Я использую DB :: raw для объединения, но я не могу найти красноречивый пример привязки параметров к DB::raw, который не включает внешнюю оболочку DB::select(DB::raw()), и я пробовал использовать :searchTerm и передача ассоциативного массива в качестве второго аргумента DB::raw, и я также пробовал использовать LIKE ? в обеих ситуациях, $filters['searchFilter'] возвращает null в выгруженном, связанном запросе , но dd() из $filters['searchFilters'] показывает, что он определенно установлен.

Использование sprintf() не дает мне никакой защиты от SQL инъекции. Есть ли лучший способ сделать это?

$users->where(function ($query) use ($filters) {
    $query->orWhere(
        DB::raw("CONCAT(users.forename, ' ', users.surname, ' ', CASE WHEN roles.name IS NULL THEN ' ' ELSE roles.name END, ' ', users.username)"),
       'LIKE',
       sprintf('%%%s%%', $filters['searchFilter'])
    );
});

1 Ответ

0 голосов
/ 17 июня 2020

Я решил это, используя ->orWhereRaw следующим образом:

        $users->where(function ($query) use ($searchTerm) {
            $query->orWhereRaw('users.forename LIKE ?', [sprintf('%%%s%%', $searchTerm)]);
            $query->orWhereRaw('users.surname LIKE ?', [sprintf('%%%s%%', $searchTerm)]);
            $query->orWhereRaw('CONCAT(users.forename, \' \', org_users.surname) LIKE ?', [sprintf('%%%s%%', $searchTerm)]);
            $query->orWhereRaw('users.username LIKE ?', [sprintf('%%%s%%', $searchTerm)]);
            $query->orWhereRaw('CASE WHEN roles.name IS NOT NULL THEN auth_roles.name ELSE \' \' END LIKE ?', [sprintf('%%%s%%', $searchTerm)]);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...