2009-09-12 6 views
0

Je les relations suivantes mis en place:données Interrogation sur la base de 3 relation niveau CakePHP

A HABTM B 
B belongsTo C 
C hasMany B 

Maintenant, pour une donnée A, je dois tout C avec le B ci-joint. Je peux écrire les requêtes SQL, mais quelle est la bonne façon de faire CakePHP? Quelle méthode dois-je appeler sur quel modèle, et avec quels paramètres?

Répondre

0

je partirais avec réponse « Aziz et de traiter simplement les données qu'il entre en jeu. Si vous avez besoin C d'être votre principal modèle cependant, vous devrez faire petite solution de contournement. Le gâteau n'est pas terriblement bon avec les conditions sur les modèles liés encore, particulièrement sur le type enlevé de requêtes de cousins ​​du 3ème cousin. Il ne fait généralement que des requêtes JOIN sur les relations belongsTo 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 être quelque chose comme 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 ce produit tout à fait un certain nombre de requêtes, il est donc pas vraiment une solution optimale. Ecrire votre propre SQL pourrait en fait être le moyen le plus propre.

EDIT:

Sinon, vous pourriez re-bind your associations on the fly pour les rendre les relations hasMany/belongsTo, très probablement à l'aide de la table/joint modèle A et B. Cela pourrait vous permettre d'utiliser des conditions plus facilement sur les modèles connexes, mais il est encore difficile d'aller chercher Cs quand la condition est sur A.

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

comme ça?

+0

Non, cela place le C sous chaque B sous le A. J'ai besoin de C d'abord, avec une liste de B, avec B comme A comme condition. –

+0

pourquoi trouver «premier» ?? Ne devrait-il pas être trouvé «tout» comme pour un A donné, tous les C avec B sont requis. –

+0

@Adit: Ceci trouve * un * (le * premier *) A et * tous * les Bs et C attachés. – deceze

0

cela pourrait fonctionner

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