2010-12-02 5 views
0

Ich habe eine Tabelle namens Landmarken und eine Tabelle namens Kategorien mit einer HABTM-Beziehung zueinander. Ich versuche, mit dem folgenden Code für eine bestimmte Sehenswürdigkeit alle Kategorien abzurufen:Was ist falsch mit meiner CakePHP HABTM Abfrage?

$this->set('selected_categories', $this->Category->find('list', 
    array('contain'=>array(
     'Landmarks'=>array(
      'conditions'=>array('Landmark.num'=>7) 
))))); 

ich die Datenbankabfrage getestet haben, die sich daraus ergibt (wie in den Debug-Level 2 ausgedruckt), und es scheint zu bekommen die richtigen Ergebnisse, dh eine Teilmenge der Kategorien. Wenn ich allerdings in der Ansicht $ ausgewählte_Kategorien var_dump, bekomme ich stattdessen eine Liste aller Kategorien.

Fehle ich etwas offensichtlich hier?

ETA: Ich sagte eine Lüge, als ich sagte, dass die obige Abfrage funktionierte. Etwas anderes auf der Seite generiert die SQL-Abfrage, die ich möchte! Welches ist:

Antwort

1

Angeben des Suchtyps als 'Liste' ist nicht kompatibel mit dem Verhalten Behaviable.

Verwendung verbindet statt dies zu tun:

$selectedCategories = $this->Category->find('list', array(
    'joins' => array(
     array(
      'table' => 'categories_landmarks', 
      'alias' => 'CategoriesLandmark', 
      'type' => 'inner', 
      'conditions' => array("CategoriesLandmark.category_id = Category.id") 
     ), 
     array(
      'table' => 'landmarks', 
      'alias' => 'Landmark', 
      'type' => 'inner', 
      'conditions' => array(
       "CategoriesLandmark.landmark_id = Landmark.id", 
       'Landmark.num' => 7 
      ) 
     ), 
    ) 
)); 

würde ich im Idealfall das wie so direkt in der Kategorie Modell platzieren:

function fetchListByLandmarkNum($landmarkNum) { 
    return $this->find('list', array(
     'joins' => ... 
    )); 
} 

Und es dann von der Steuerung aufrufen:

$selectedCategories = $this->Category->fetchListByLandmarkNum(7); 
$this->set(compact('selectedCategories')); 

Machen Sie Ihre Modelle immer fett und y unsere Controller mager. Sie können diese Funktion jetzt an anderer Stelle wiederverwenden. :)

Der Grund, warum alle Kategorien zurückgegeben werden, ist, dass die Bedingung auf die verwandten Landmark-Modelle angewendet wird. Das Ergebnis dieser Containable-Abfrage wäre, alle Kategorien abzurufen und nur die Landmark-Modelle zurückzugeben, die num = 7 erfüllen. Es sollte NICHT so interpretiert werden, dass nur diejenigen Kategorien zurückgegeben werden, für die die Landmark-Modelle die Bedingung erfüllen.

+0

Ja, ich sagte eine Lüge, als ich sagte, dass meine Anfrage funktionierte - werde meine Frage neu bearbeiten. Ich denke, ich habe versucht, die Liste auf "alle" zu ändern, aber ich werde es auf jeden Fall nochmal versuchen! – thesunneversets

+0

Ich habe gerade meine Antwort bearbeitet. Versuchen Sie es mit Joins. Es auf "alle" zu setzen, würde auch nicht funktionieren. Redigiert meine Antwort, um zu erklären warum. – RabidFire

+0

Funktioniert wirklich gut ... plus danke für die zusätzliche Hilfe, die Sachen von meinen Kontrollen und in meinen Modellen aufräumt! – thesunneversets