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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top