In un'app CakePhp 3, come posso costruire una query che trova tutto da una tabella che non contiene la sua tabella associata?
-
21-12-2019 - |
Domanda
C'è un modo semplice per ottenere l'inverso del metodo contain
del querybuilder?
Sto usando le associazioni di appartomany con una tavola di unione per associare i due modelli.
Emailstable $this->belongsToMany('Issues');
Issuestable $this->belongsToMany('Emails');
Quindi non posso fare solo qualcosa come:
$unparsed_emails = $this->Emails->find('all')->where(['issue_id is null']);
.
Sembra che l'inverso dei seguenti fornirebbe e-mail che non hanno ancora problemi associati:
$unparsed_emails = $this->Emails->find->contain(['Issues']); //need inverse of this
.
Penso di dover mancare qualcosa dalla Documentazione CakePhp 3 Orm / Querybuilder, ma non riesco a trovarlo.
Soluzione
Non sono ancora così tanto nel costruttore di query, quindi non sono sicuro se ci sono metodi più semplici, ma un join sinistro dovrebbe farlo.
$this->Emails
->find('all')
->leftJoin('emails_issues', 'emails_issues.email_id = Emails.id')
->where('emails_issues.id IS NULL');
.
Questo dovrebbe tradurre in una query come
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
.
che selezionare tutte le e-mail che non hanno problemi assegnati.