En una aplicación cakephp 3, ¿cómo puedo crear una consulta que encuentre todo en una tabla que NO contenga su tabla asociada?

StackOverflow https://stackoverflow.com//questions/25019422

  •  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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top