Кроме запроса в Laravel

#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