У меня есть массив (arr) с n элементами, n = 1 или 2 и таблица в базе данных под названием employees, которая содержит два поля (name и surname)

Я хочу выполнить следующий запрос, используя Eloquent (и, возможно, какую-то итерацию ?), Чтобы реализовать «мгновенный поиск» "функциональность:

select * from employees
where (name LIKE '%arr[0]%' AND surname LIKE '%arr[1]%')
OR
where (name LIKE '%arr[1]%' AND surname LIKE '%arr[0]%')

РЕДАКТИРОВАТЬ: Чтобы сформулировать свой вопрос более четко, в случае, если есть только один элемент в arr, я хотел бы выполнить следующий запрос:

select * from employees
where (name LIKE '%arr[0]%' AND surname LIKE '%arr[0]%')

То есть искать данный элемент arr в полях name или surname.

0
ira 26 Июн 2016 в 16:46

1 ответ

Лучший ответ

Вы должны использовать расширенные предложения Where, которые позволяют группировать WHERE s (как и в круглых скобках):

$arr = ['Some', 'Name'];
$employees = Employee::where(function($query) use ($arr) {
                 $query->where('name', 'LIKE', '%' . $arr[0] . '%')
                       ->where('surname', 'LIKE', '%' . $arr[1] . '%');
             })->orWhere(function($query) use ($arr) {
                 $query->where('name', 'LIKE', '%' . $arr[1] . '%')
                       ->where('surname', 'LIKE', '%' . $arr[0] . '%');
             })->get();

Что производит запрос:

select * from `employees` where (`name` LIKE ? and `surname` LIKE ?) or (`name` LIKE ? and `surname` LIKE ?)

? будет передан в качестве параметров подготовленному оператору laravel.

1
tkausl 26 Июн 2016 в 16:58
Спасибо за ваш ответ, однако это решение отлично работает, учитывая, что arr содержит ровно два элемента, но в случае, если есть только один элемент (или возможно более двух в будущей версии), вы получите «неопределенное смещение» ErrorException
 – 
ira
26 Июн 2016 в 16:59
Вы правы, если это только один, вы можете легко использовать другой запрос, который имеет только два WHERE, а не четыре, но когда он получает более двух значений, это может создать много запросов, если вы хочу проверить все возможные комбинации.
 – 
tkausl
26 Июн 2016 в 17:04
Это звучит как хорошая идея, но можно ли реализовать этот оператор if / else, используя какую-то причудливую «красноречивую технику». Поскольку, поскольку я очень хочу загрузить модель Employee, использование условного оператора и второго запроса приведет к дублированию кода в контроллере.
 – 
ira
26 Июн 2016 в 17:16
Я так не думаю. MySQL / Eloquent не предназначен для выполнения такой логики. Вы что-то просите, вы что-то получаете. Но решать, о чем спросить - не работа Eloquent.
 – 
tkausl
26 Июн 2016 в 17:23