Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.08.2019 16:26:56

выбрать записи которых нет

Подскажите, всю голову сломала) есть 2 модели и связь многие ко многим (3 таблицы соответственно). знаю как выбрать из связанной таблицы запись определенную по типу

$this->builder->whereHas('2 таблица', function ($query) {
            $query->where('title', 'нужный');
        });

но не могу понять как выбрать те записи из 1 таблицы, у которых этой связи нет (т.е. совсем нет никаких связей в связующей таблице или там есть какие угодно, кроме title='нужный')
заранее спасибо

Не в сети

#2 28.08.2019 17:02:18

Re: выбрать записи которых нет

А если так

$this->builder->whereHas('2 таблица', function ($query) {
            $query->where('title', '!=', 'нужный');
        });

Не в сети

#3 28.08.2019 17:08:26

Re: выбрать записи которых нет

$this->builder->whereHas('2 таблица', function ($query) {
            $query->where('title', '!=', 'нужный');
        });

это было бы слишком просто) в Вашем примере выберутся только связанные записи, у которых нет ссылки на title='нужный', а не связанные записи не попадут в выборку вообще.

в общем вроде я нашла ответ.

$this->builder->whereDoesntHave('2 таблица', function($query) {
            $query->where('title', '=', 'нужный');
});

но могу ошибаться)
был еще вариант сделать ->doesntHave и ->orWhereHas, но тогда следующие условия ->where уже плохо проходят при динамическом формировании моего запроса) получается что идет and ...or и выборка ломается.
Если кто понимает чуть больше в таких запросах, подскажите

Изменено Yuliya (28.08.2019 17:10:58)

Не в сети

#4 28.08.2019 17:12:42

Re: выбрать записи которых нет

$query->where('title', '=', 'нужный')  и $query->where('title', 'нужный'); - результат аналогичный
Вопрос был

или там есть какие угодно, кроме title='нужный'

'!=" - это и есть "кроме"

Не в сети

#5 28.08.2019 17:14:33

Re: выбрать записи которых нет

$query->where('title', '=', 'нужный')  и $query->where('title', 'нужный'); - результат аналогичныйВопрос былили там есть какие угодно, кроме title='нужный''!=" - это и есть "кроме"

вопрос был
как выбрать те записи из 1 таблицы, у которых этой связи нет (т.е. совсем нет никаких связей в связующей таблице или там есть какие угодно, кроме title='нужный'). 2 условия

Не в сети

#6 29.08.2019 16:45:09

Re: выбрать записи которых нет

Попробуйте как вариант "сырые" запросы, в которых можете использовать OUTER JOIN (LEFT / RIGHT JOIN). Вообще в SQL вы можете вкладывать запрос в запрос, т.е. извлечь что-то одно, а потом добавить с помощью INNER JOIN или OUTER JOIN, или вообще SELECT из другого SELECT (даже SELECT из одного и того же присвоив копии псевдоним с помощью AS).

Не в сети

#7 29.08.2019 17:26:18

Re: выбрать записи которых нет

Попробуйте как вариант "сырые" запросы, в которых можете использовать OUTER JOIN (LEFT / RIGHT JOIN). Вообще в SQL вы можете вкладывать запрос в запрос, т.е. извлечь что-то одно, а потом добавить с помощью INNER JOIN или OUTER JOIN, или вообще SELECT из другого SELECT (даже SELECT из одного и того же присвоив копии псевдоним с помощью AS).

в теории запросов SQL я хорошо понимаю и там простор для ума) но в данном случае уже все организовано через Builber так. поэтому встал вопрос как встроить эту выборку. спасибо Вам за отклик. мой вариант работает тоже

Не в сети

#8 30.08.2019 15:42:07

Re: выбрать записи которых нет

Может тоже плюсом будут -

$this->builder->where(function($q){
   $arrId = Table2::where('title', 'нужный')->pluck('связующее поле таблицы 2');
   $q->whereNotIn('связующее поле таблицы 1',$arrId);
})

Если через джойны

$this->builder->leftJoin('table2', 'связующее поле таблицы 2', '=', 'связующее поле таблицы 1')->where(function($q){ 
             $q->whereNull( table2.id )->OrWhere('table2.title', '!=', 'нужный');
       });

Изменено Alexandr5 (30.08.2019 15:48:01)

Не в сети

Подвал раздела