Frage

Ich habe die folgenden Beziehungen aufgebaut werden:

A HABTM B
B belongsTo C
C hasMany B

Nun, für einen gegeben, ich brauche alle C mit B verbunden.Ich kann die SQL-Abfragen schreiben, aber was ist der richtige CakePHP Weg?Welche Methode rufe ich auf die Modell, und mit welchen Parametern?

War es hilfreich?

Lösung

Ich würde gehen mit Aziz' beantworten und einfach verarbeiten von Daten, wie es kommt in.Wenn Sie benötigen C, um das primäre Modell, aber Sie ' ll haben zu tun, ein wenig Abhilfe.Kuchen ist nicht irrsinnig gute mit Bedingungen für Verwandte Modelle noch, vor allem auf entfernt 3rd cousins Art von Abfragen.Es in der Regel nicht nur die tatsächlichen JOIN-Abfragen auf belongsTo oder hasMany-Beziehungen;nicht auf HABTM-Beziehungen, obwohl die von Ihr bekommt in separaten Abfragen.Das bedeutet, dass Sie können nicht gehören die Bedingungen im Zusammenhang HABTM-Modelle.

Ihre beste Wette, dann könnte so etwas wie diese:

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

Beachten Sie, dass dies produziert Recht eine Reihe von Abfragen, es ist also nicht wirklich eine optimale Lösung.Schreiben Ihre eigenen SQL-vielleicht sogar der sauberste Weg.

EDIT:

Alternativ, Sie könnte re-bind, Ihre Verbände auf die Fliegen machen Sie hasMany/belongsTo Beziehungen, die meisten wahrscheinlich mit der join-Tabelle/Modell A und B.Möglicherweise können Sie mit der Bedingungen auf Verwandte Modelle leichter, aber es ist noch schwierig zu Holen, Cs, wenn die Bedingung für A.

Andere Tipps

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

so?

Dies könnte funktionieren

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

Ich würde denken "Contain" Verhalten ( http://book.cakephp.org / view / 474 / Contain ) ... gibt viel Kontrolle relevante Daten zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top