Dans une application cakephp 3, comment puis-je créer une requête qui trouve tout à partir d'une table qui ne contient PAS sa table associée ?
-
21-12-2019 - |
Question
Existe-t-il un moyen simple d'obtenir l'inverse de contain
méthode du générateur de requêtes ?
J'utilise des associations AppartientToMany avec une table de jointure pour associer les deux modèles.
Tableau des e-mails $this->belongsToMany('Issues');
Tableau des problèmes $this->belongsToMany('Emails');
donc je ne peux pas faire quelque chose comme :
$unparsed_emails = $this->Emails->find('all')->where(['issue_id is null']);
Il semble que l'inverse de ce qui suit fournirait des e-mails qui n'ont PAS encore de problèmes associés :
$unparsed_emails = $this->Emails->find->contain(['Issues']); //need inverse of this
Je pense qu'il me manque quelque chose dans la documentation cakephp 3 ORM/Querybuilder, mais je ne le trouve pas.
La solution
Je ne suis pas encore très intéressé par le générateur de requêtes, donc je ne sais pas s'il existe des méthodes plus simples, mais une jointure gauche devrait le faire.
$this->Emails
->find('all')
->leftJoin('emails_issues', 'emails_issues.email_id = Emails.id')
->where('emails_issues.id IS NULL');
Cela devrait se traduire par une requête comme
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
qui sélectionnerait tous les e-mails auxquels aucun problème n’est attribué.