Estoy tratando de comportarme. Así, en lugar de utilizar siguiente sintaxis SQL:¿Cómo anidar se une con CakePHP?
select *
from tableA INNER JOIN
tableB on tableA.id = tableB.tableA_id LEFT OUTER JOIN
(tableC INNER JOIN tableD on tableC.tableD_id = tableD.id)
on tableC.tableA_id = tableA.id
me gustaría usar el CakePHP model->find()
. Esto me permitirá usar el Paginator
también, ya que eso no funcionará con consultas SQL personalizadas, por lo que yo entiendo (a menos que codifique una sola consulta de paginación para el modelo que me parece un poco inflexible).
Lo que he probado hasta ahora:
/* inside tableA_controller.php, inside an action, e.g. "view" */
$this->paginate['recursive'] = -1; # suppress model associations for now
$this->paginate['joins'] = array(
array(
'table' => 'tableB',
'alias' => 'TableB',
'type' => 'inner',
'conditions' => 'TableB.tableA_id = TableA.id',
),
array(
'table' => 'tableC',
'alias' => 'TableC',
'type' => 'left',
'conditions' => 'TableC.tableA_id = TableA.id',
'joins' = array(# this would be the obvious way to do it, but doesn't work
array(
'table' => 'tableD',
'alias' => 'TableD',
'type' => 'inner',
'conditions' => 'TableC.tableD_id = TableD.id'
)
)
)
)
Es decir, que anidan las uniones en la estructura. Pero eso no funciona (CakePHP simplemente ignora el 'joins'
elemento anidado, que era una especie de lo que esperaba, pero triste.
he visto indicios en los comentarios sobre cómo hacer subconsultas (en la cláusula where
) usando un generador de expresiones . se puede utilizar un truco similar aquí
¿Por qué tiene que estar anidado? ¿No puedes hacer lo mismo con todas las combinaciones en el nivel superior? –
Ojalá pudiera, pero el resultado es diferente: quiero todos los resultados de la unión interna de nivel superior con datos opcionales añadidos desde la unión interna anidada. Si aplanar esto, entonces pierdo todas las filas en (tabla A junta interna TableB) que no tienen TableD correspondiente ... –
Wow eso es bastante complejo. Probablemente trataré de extender find() de alguna manera para agregar algunos parámetros adicionales –