En una aplicación cakephp 3, ¿cómo puedo crear una consulta que encuentre todo en una tabla que NO contenga su tabla asociada?
-
21-12-2019 - |
Pregunta
¿Existe una forma sencilla de obtener la inversa de la contain
método del generador de consultas?
Estoy usando asociaciones de pertenece a Many con una tabla de unión para asociar los dos modelos.
Tabla de correos electrónicos $this->belongsToMany('Issues');
Tabla de problemas $this->belongsToMany('Emails');
entonces no puedo simplemente hacer algo como:
$unparsed_emails = $this->Emails->find('all')->where(['issue_id is null']);
Parece que lo inverso de lo siguiente proporcionaría correos electrónicos que aún NO tienen problemas asociados:
$unparsed_emails = $this->Emails->find->contain(['Issues']); //need inverse of this
Creo que me debe faltar algo en la documentación de cakephp 3 ORM/Querybuilder, pero no puedo encontrarlo.
Solución
Todavía no estoy muy interesado en el generador de consultas, por lo que no estoy seguro de si existen métodos más simples, pero una combinación izquierda debería ser suficiente.
$this->Emails
->find('all')
->leftJoin('emails_issues', 'emails_issues.email_id = Emails.id')
->where('emails_issues.id IS NULL');
Esto debería traducirse en una consulta como
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
que seleccionaría todos los correos electrónicos que no tienen ningún problema asignado.