Sto provando a comportarmi bene. Così, invece di utilizzare seguente sintassi SQL:Come nidificare i join 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
mi piacerebbe utilizzare la CakePHP model->find()
. Questo mi consentirà di usare anche lo Paginator
, dal momento che non funzionerà con query SQL personalizzate per quanto ho capito (a meno che non abbiate hardcode una singola query di impaginazione sul modello che mi sembra un po 'inflessibile).
Quello che ho provato finora:
/* 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'
)
)
)
)
Cioè, nesting i join nella struttura. Ma questo non funziona (CakePHP solo ignora l'nidificato 'joins'
elemento che era una sorta di quello che mi aspettavo, ma triste.
ho visto suggerimenti nei commenti su come fare subquery (nella clausola where
) utilizzando un costruttore di dichiarazione . può un trucco simile essere utilizzato qui
Perché deve essere annidato? Non puoi semplicemente fare la stessa cosa con tutti i join al massimo livello? –
Vorrei poterlo fare, ma il risultato è diverso: voglio tutti i risultati del join interno di livello superiore con dati opzionali aggiunti al join interno nidificato. Se appiattisco questo, allora perdo tutte le righe (TableA inner join TableB) che non hanno TableD corrispondente ... –
Wow è piuttosto complesso. Probabilmente cercherò di estendere find() in qualche modo per aggiungere alcuni parametri aggiuntivi –