#mysql #laravel #eloquent
#mysql #laravel #красноречивый
Вопрос:
Я хотел бы исключить определенные данные из запроса
В идеале это выглядело бы примерно так
Model::where('firstname', 'like', '%$firstname%')
->exceptWhere('lastname, 'like', '%$lastname%');
Мы хотим загрузить все данные, где условие A является истинным,
Но исключите результаты, которые соответствуют условию B.
Мы должны использовать синтаксис like
or not like
.
В нашей программе мы имеем дело с большими данными. Мы не можем использовать whereIn
, поскольку SQL имеет ограничение в 65 000 заполнителей. Поэтому мы должны выбрать правильные данные в запросе.
Как я могу сделать это в Laravel или raw SQL? Мы получаем сообщение об ошибке, что exclude
ключевое слово недоступно в MySQL 5.4.
Мы также попробовали несколько вариантов, которые не сработали, например
WHERE (condition A)
AND NOT (condition B)
Тем не менее, я могу получить правильные результаты, используя Sequel Pro GUI, используя contains
и does not contain
, но я не могу получить те же результаты, используя SQL / Eloquent .
Комментарии:
1. Вы пробовали
->where('lastname, 'not like', '%$lastname%');
?2. Да, он возвращает только те результаты, которые не похожи на условие A. Он не отфильтровывает их. Нам нужно исключить B из A.
3. вы пробовали
where('lastname, '!=', '%$lastname%');
?4. Пожалуйста, опишите, какого результата вы хотите. Я понял, что вам нужны все пользователи с именем пользователя, включая указанное имя, но без пользователей с фамилией, включающей указанную фамилию. Это правильно ?
5. Да, мы хотим включить условие A, но исключить любые результаты, соответствующие условию B.
Ответ №1:
попробуйте whereNotExists()
Model::where('firstname', 'LIKE', "%$firstname%")
->whereNotExists(function ($q) use ($lastname) {
$q->where('lastname', 'like', "%$lastname%");
})->get();
return view('home');
он будет генерировать SQL, подобный
select * from `models` where `firstname` LIKE ? and not exists (select * where `lastname` like ?)
ссылка на ссылку https://dev.mysql.com/doc/refman/8.0/en/exists-and-not-exists-subqueries.html