Создание Laravel Eloquent Query с неизвестным количеством параметров

Я пытаюсь выяснить, как создать запрос Eloquent динамически, используя пользовательский ввод, который изменяет запрос в зависимости от длины ввода. Используя простой MySQL, это просто... просто конкатенация строки запроса на основе ввода пользователем. Использование Eloquent невозможно, если вы не используете a) использовать "сырой" SQL-запрос, который побеждает цель использования Eloquent или b) Используйте что-то очень нездоровое, как функция eval().

Как вы можете выполнять итерацию по пользовательскому вводу неизвестной длины и создать запрос Eloquent, который ищет несколько полей для слов, используя комбинации "OR" и "AND"

Рассмотрим следующий псевдокод, который не может работать.

$search = "cat sat on the mat";
$searchWords = explode(' ', $search);
$data['finds'] = DB::table('mytable') [... incomplete query]
foreach ($searchWords as $word) {
 ->where('firstname', 'like', '%' . $word . '%')
 ->orWhere('lastname', 'like', '%' . $word . '%')
 ->orWhere('address', 'like', '%' . $word . '%')->AND [... next word]
}

Или это просто вопрос сдачи и использования необработанного запроса? Я могу запустить отдельный запрос для каждого слова, а затем использовать PHP для слияния/обработки результатов, но это кажется очень громоздким для того, что можно сделать в одном запросе в традиционном MySQL.

Традиционный запрос MySQL для того, что я пытаюсь сделать, будет следующим:

SELECT * FROM `mytable`
WHERE (firstame LIKE '%$cat%' OR lastname LIKE '%cat%' OR address LIKE '%cat%')
AND (firstname LIKE '%sat% OR lastname LIKE '%sat%' OR address LIKE '%sat%')
AND [etc, etc, for all words in user input]
1 ответ

Вы можете сгруппировать все where в цикле внутри "родительского" where.

$query = DB:: table ('mytable');

foreach ($searchWords as $word) {
 $query->where(function ($query) use ($word)
 {
 $query->orWhere('firstname', 'like', '%' . $word . '%');
 $query->orWhere('lastname', 'like', '%' . $word . '%');
 $query->orWhere('address', 'like', '%' . $word . '%');
 });
}
$results = $query->get();

В результате SQL-запрос будет похож на тот, который вам нужен. Вы можете проверить исходный результат SQL, распечатав $query->toSql().

licensed under cc by-sa 3.0 with attribution.