Как в приложении cakephp 3 создать запрос, который находит все из таблицы, которая НЕ содержит связанную с ней таблицу?
-
21-12-2019 - |
Вопрос
Есть ли простой способ получить обратное значение contain
метод построителя запросов?
Я использую ассоциации ownToMany с таблицей соединения, чтобы связать две модели.
Электронная почтаТаблица $this->belongsToMany('Issues');
Таблица проблем $this->belongsToMany('Emails');
поэтому я не могу просто сделать что-то вроде:
$unparsed_emails = $this->Emails->find('all')->where(['issue_id is null']);
Кажется, что обратный вариант следующего будет предоставлять электронные письма, которые еще НЕ имеют связанных с ними проблем:
$unparsed_emails = $this->Emails->find->contain(['Issues']); //need inverse of this
Я думаю, что мне что-то не хватает в документации cakephp 3 ORM/Querybuilder, но я не могу этого найти.
Решение
Я еще не очень разбираюсь в построителе запросов, поэтому не уверен, есть ли более простые методы, но левое соединение должно помочь.
$this->Emails
->find('all')
->leftJoin('emails_issues', 'emails_issues.email_id = Emails.id')
->where('emails_issues.id IS NULL');
Это должно преобразоваться в запрос типа
SELECT
Emails.id AS `Emails__id`, ...
FROM
emails AS Emails
LEFT JOIN
emails_issues emails_issues ON emails_issues.email_id = Emails.id
WHERE
emails_issues.id IS NULL
который выберет все электронные письма, которым не назначены какие-либо проблемы.