Frage

Ich habe eine n...n Struktur für zwei Tabellen, makes und models . Bisher kein Problem.

In einer dritten Tabelle ( products ) wie:

id
make_id
model_id
...

Mein Problem ist eine Ansicht, die Erzeugnisse eines spezifi Schaffung make in meinem ProductsController enthält, das ist nur Modelle machen:

Ich dachte, das funktionieren könnte:

var $uses = array('Make', 'Model');

$this->Make->id = 5; // My Make

$this->Make->find(); // Returns only the make I want with it's Models (HABTM)
$this->Model->find('list'); // Returns ALL models
$this->Make->Model->find('list'); // Returns ALL models

Also, wenn ich die list verwenden möchten, um meine Ansicht zu passieren Radio-Buttons erstellen Ich habe eine foreach() in meinem make Array tun alle Modelle Titel zu finden und ein neues Array erstellen und Bitte senden Sie die Ansicht über $this->set().

$makeArray = $this->Make->find();
foreach ($makeArray['Model'] as $model) {
    $modelList[] = $model['title'];
}
$this->set('models', $models)

Gibt es eine einfachere Möglichkeit, diese Liste zu kommen, ohne unter Hinweis auf das make Array. Es wird eine commom Aufgabe sein, entwickelt sich solche Szenarien in meiner Anwendung (en).

Vielen Dank im Voraus für jeden Hinweis!

War es hilfreich?

Lösung 5

Die Lösung kann mit der Verwendung des with Betriebes in HABTM Array auf dem Modell erreicht werden.

with Verwenden Sie können den "mittleren" Tisch wie definieren:

$habtm = " ...
  'with' => 'MakeModel',
   ... ";

Und intern im Modell oder Controller können Sie Bedingungen an die find Verfahren erteilen.

Siehe auch: http: / /www.cricava.com/blogs/index.php?blog=6&title=modelizing_habtm_join_tables_in_cakephp_&more=1&c=1&tb=1&pb=1

Andere Tipps

Hier mein Tipp: Versuchen Sie Ihre Abfrage in regelmäßigen SQL geschrieben bekommen, bevor Sie mit dem Kuchen Bibliothek zu rekonstruieren. Im Grunde tun Sie viel zusätzliche Arbeit, die die DB für Sie tun können. Ihr Ansatz (nur für die Show - nicht gut SQL):

SELECT * FROM makes, models, products WHERE make_id = 5

Sie nehmen nicht berücksichtigen, die Beziehungen (es sei denn, Kuchen Auto-magisch die Beziehungen der Tabellen versteht)

Sie sind wahrscheinlich der Suche nach etwas, das diese Dinge miteinander verbindet:

SELECT models.title FROM models 
INNER JOIN products 
  ON products.model_id = models.model_id 
  AND products.make_id = 5

Hoffentlich ist dies ein Schub in der richtigen Richtung?

Geht man von Ihrem Kommentar, was Sie für Fragen ist, wie die Ergebnisse von einem bestimmten Modell zu erhalten, wo die Bedingung in einem HABTM bezogenen Modell ist. D. h etwas, das man in der Regel mit einer JOIN-Anweisung in rohen SQL tun würde.
das ist zur Zeit eine der wenigen Schwachpunkte des Kuchens. Es gibt verschiedene Strategien, damit umzugehen.

  • Haben Sie das entsprechende Modell B Rückkehr alle IDs der möglichen Kandidaten für das Modell A, dann eine zweite Abfrage auf Modell A. D.h. tun.

    $this->ModelB->find('first', array('conditions' => array('field' => $condition)));
    array(
        ['ModelB'] => array( ... ),
        ['ModelA'] => array(
            [0] => array(
                'id' => 1
            )
    )
    

    Jetzt haben Sie ein Array aller IDs von ModelA, die zu Modell B gehören, die Ihre Bedingungen entsprechen, die Sie leicht extrahieren können mit Set :: extract (). Grundsätzlich ist das Äquivalent von SELECT model_a.id FROM model_b JOIN model_a WHERE model_b.field = xxx. Weiter Sie suchen ModelA:

     $this->ModelA->find('all', array('conditions' => array('id' => $model_a_ids)));
    

    Das wird produzieren SELECT model_a.* FROM model_a WHERE id IN (1, 2, 3), das zu tun, die JOIN-Anweisung ein Umweg ist. Wenn Sie Bedingungen auf mehr als einem verwandten Modell benötigen, wiederholen, bis Sie für ModelA alle IDs haben, SQL die Kreuzung aller IDs verwenden (WHERE id IN (1, 2, 3) AND id IN (3, 4, 5)).

  • Wenn Sie benötigen nur eine Bedingung auf Modell B, sondern wollen ModelA abzurufen, suchen Sie einfach nach Modell B. Kuchen wird automatisch heruntergeladen verwandte ModelAs für Sie (siehe oben). Sie könnten festlegen müssen :: extract () sie wieder, aber das könnte schon ausreichend sein.

  • Sie können das obige Verfahren verwenden und kombinieren es mit dem Contain Verhalten um mehr Kontrolle über die Ergebnisse zu erhalten.

  • Wenn alles andere fehlschlägt oder die oben genannten Methoden einfach zu viel Aufwand produzieren, können Sie immer noch Ihre eigene rohe SQL mit $this->Model->query() schreiben. Wenn Sie kleben an den Kuchen SQL-Standards (Tabellen korrekt mit FROM model_as AS ModelA Namensgebung) Kuchen wird noch nachbearbeiten Ihre Ergebnisse richtig.

Hope dies sendet Sie in der richtigen Richtung.

Alle Ihre verschiedenen Make-> finden () und Model-> finden () Anrufe sind völlig unabhängig voneinander. Auch Make-> Modell-> finden () ist die gleiche wie Model-> finden (), Kuchen nicht in irgendeiner Weise erinnern oder berücksichtigen, was Sie bereits in anderen Modellen gefunden zu haben. Was Sie suchen ist so etwas wie:

$this->Product->find('all', array('conditions' => array('make_id' => 5)));

Schauen Sie sich die Set :: extract () Methode für eine Liste von Modell Titeln aus den Ergebnissen von $ this- bekommen> Make-> finden ()

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