Question

Les relations suivantes sont configurées:

A HABTM B
B belongsTo C
C hasMany B

Maintenant, pour un A donné, j'ai besoin de tout C avec les B attachés. Je peux écrire les requêtes SQL, mais quelle est la bonne manière de CakePHP? Quelle méthode dois-je appeler sur quel modèle et avec quels paramètres?

Était-ce utile?

La solution

J'irais avec la réponse d'Aziz et je traiterais simplement les données au fur et à mesure qu'elles arriveraient. Si vous avez besoin que C soit votre modèle principal, vous devrez faire un petit peu de solution de contournement. Cake n'est pas terriblement bon avec des conditions sur les modèles associés pour le moment, en particulier sur les requêtes de type 3e cousins ??retirées. Habituellement, seules les requêtes JOIN réelles sont effectuées sur les relations hasTany ou hasMany; pas sur les relations HABTM cependant, celles qu’il obtient dans des requêtes séparées. Cela signifie que vous ne pouvez pas inclure de conditions sur les modèles HABTM associés.

Votre meilleur pari pourrait alors ressembler à ceci:

// 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
);

Notez que cela génère pas mal de requêtes, ce n'est donc pas vraiment une solution optimale. Écrire votre propre code SQL pourrait bien être le moyen le plus propre.

EDIT:

Vous pouvez également re-bind vos associations à la volée pour les transformer en plusieurs relations hasNany / AppartTo, qui utilisent probablement les tables / modèles de jointure de A et B. Cela pourrait vous permettre d'utiliser plus facilement les conditions sur des modèles associés, mais il est toujours difficile d'extraire des Cs. lorsque la condition est sur A.

Autres conseils

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

comme ça?

cela pourrait fonctionner

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

Je penserais à " Containable " comportement ( http://book.cakephp.org/view/474/Containable ) ... donne beaucoup de contrôle sur la recherche de données connexes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top