У меня есть следующий запрос (сокращенно для краткости):
$employees = Employee::where('first_name', 'LIKE', "%$query%")
->orWhere('last_name', 'LIKE', "%$query%")
Теперь это работает, когда пользователь вводит одно имя, например «Джон» или «Смит», но когда он вводит «Джон Смит», он ничего не находит. Я пропустил дополнительный orWhere?






Вы должны были бы добавить 3-й orWhere. Для нашей функции поиска мы используем что-то вроде этого:
Employee::whereraw("COALESCE(last_name, '') LIKE '%$query%'")
->Orwhereraw("COALESCE(first_name, '') LIKE '%$query%'")
->Orwhereraw("COALESCE(last_name + ', ' + first_name, '') LIKE '%$query%'")
Добавление Coalesce, похоже, помогло с некоторыми проблемами, которые у нас были, когда мы впервые реализовали его, хотя не уверен, что это необходимо в вашем случае.
Попробуй это :
Employee::where(DB::raw('CONCAT(first_name," ",lastname)'), 'LIKE', "%' . $query . '%"))
Осторожно: ответ широко открыт для SQL-инъекций. laravel.com/docs/5.7/queries#raw-выражения
Ты можешь сделать :
$fullName = обрезать ($ запрос);
$employees = Employee::where(DB::raw("CONCAT(first_name, ' ', last_name)"), 'LIKE', "%".$fullName."%")->get();
Вы объединяете значения в базе данных для first_name + ' ' + last_name, а затем используете лайк, чтобы найти совпадающие записи.
Осторожно: ответ широко открыт для SQL-инъекций. laravel.com/docs/5.7/queries#raw-выражения
@MuratTutumlu на самом деле нет, DB::raw используется в конкатенации столбцов, где не передается используемая определенная переменная. и строка запроса передается в аргументе where(), что безопасно для инъекций.
Спасибо! Все работают, но этот самый короткий!