У меня есть панель поиска пользователей, которая позволяет клиентам искать пользователей по имени, имени пользователя или имени роли пользователя (например, 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'])
);
});