Richiesta di dati basata sulla relazione di 3 ° livello in CakePHP
-
06-07-2019 - |
Domanda
Ho impostato le seguenti relazioni:
A HABTM B
B belongsTo C
C hasMany B
Ora, per una data A, ho bisogno di tutte le C con le B attaccate. Posso scrivere le query SQL, ma qual è il modo CakePHP corretto? Quale metodo chiamo su quale modello e con quali parametri?
Soluzione
Vado con la risposta di Aziz ed elaboro semplicemente i dati non appena arrivano. Se hai bisogno che C sia il tuo modello principale, dovrai fare un po 'di soluzione. Cake non è ancora terribilmente buono con le condizioni sui modelli correlati, in particolare sulle query rimosse di cugini di terzo grado. Solitamente esegue solo query JOIN effettive su relazioni appartiene a To o molte; ma non sulle relazioni HABTM, quelle ottenute in query separate. Ciò significa che non è possibile includere condizioni sui modelli HABTM correlati.
La tua scommessa migliore potrebbe essere qualcosa del genere:
// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
'conditions' => array('A.id' => 'something'),
'recursive' => 2,
'fields' => array('A.id'),
'contain' => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));
// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
'recursive => 1
);
Nota che questo produce un sacco di domande, quindi non è davvero una soluzione ottimale. Scrivere il tuo SQL potrebbe effettivamente essere il modo più pulito.
EDIT:
In alternativa, potresti re-bind le tue associazioni al volo per farle avere molte / appartiene a relazioni, molto probabilmente usando la tabella / modello di join di A e B. Ciò potrebbe consentirti di utilizzare più facilmente le condizioni sui modelli correlati, ma è comunque difficile recuperare Cs quando la condizione è su A.
Altri suggerimenti
$this->A->find(
'first',
array('conditions'=>array('id'=>'someword'),
'recursive'=>2)
);
come questo?
potrebbe funzionare
$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));
Penso a " Containable " comportamento ( http://book.cakephp.org/view/474/Containable ) ... dà molto controllo sulla ricerca di dati correlati.