Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Подскажите, всю голову сломала) есть 2 модели и связь многие ко многим (3 таблицы соответственно). знаю как выбрать из связанной таблицы запись определенную по типу
$this->builder->whereHas('2 таблица', function ($query) {
$query->where('title', 'нужный');
});
но не могу понять как выбрать те записи из 1 таблицы, у которых этой связи нет (т.е. совсем нет никаких связей в связующей таблице или там есть какие угодно, кроме title='нужный')
заранее спасибо
Не в сети
А если так
$this->builder->whereHas('2 таблица', function ($query) {
$query->where('title', '!=', 'нужный');
});
Не в сети
$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)
Не в сети
$query->where('title', '=', 'нужный') и $query->where('title', 'нужный'); - результат аналогичный
Вопрос был
или там есть какие угодно, кроме title='нужный'
'!=" - это и есть "кроме"
Не в сети
$query->where('title', '=', 'нужный') и $query->where('title', 'нужный'); - результат аналогичныйВопрос былили там есть какие угодно, кроме title='нужный''!=" - это и есть "кроме"
вопрос был
как выбрать те записи из 1 таблицы, у которых этой связи нет (т.е. совсем нет никаких связей в связующей таблице или там есть какие угодно, кроме title='нужный'). 2 условия
Не в сети
Попробуйте как вариант "сырые" запросы, в которых можете использовать OUTER JOIN (LEFT / RIGHT JOIN). Вообще в SQL вы можете вкладывать запрос в запрос, т.е. извлечь что-то одно, а потом добавить с помощью INNER JOIN или OUTER JOIN, или вообще SELECT из другого SELECT (даже SELECT из одного и того же присвоив копии псевдоним с помощью AS).
Не в сети
Попробуйте как вариант "сырые" запросы, в которых можете использовать OUTER JOIN (LEFT / RIGHT JOIN). Вообще в SQL вы можете вкладывать запрос в запрос, т.е. извлечь что-то одно, а потом добавить с помощью INNER JOIN или OUTER JOIN, или вообще SELECT из другого SELECT (даже SELECT из одного и того же присвоив копии псевдоним с помощью AS).
в теории запросов SQL я хорошо понимаю и там простор для ума) но в данном случае уже все организовано через Builber так. поэтому встал вопрос как встроить эту выборку. спасибо Вам за отклик. мой вариант работает тоже
Не в сети
Может тоже плюсом будут -
$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)
Не в сети
Страницы 1