2010-12-09 15 views
2

Ich versuche CakePHP 1.3.5's searchable behavior mit containefähigem Verhalten zu verwenden, um Suchergebnisse für ein spezifiziertes Modell und ein zugehöriges Modell zurückzugeben (Artikel gehört zu Benutzer).Die Ergebnisse des durchsuchbaren Verhaltens von CakePHP enthalten tiefere Assoziationen

das durchsuchbare Verhalten für einen Moment zu ignorieren, die folgende Aufruf find():

$this->Article->find('all', array(
    'conditions' => array('Article.is_published' => 1), 
    'fields' => array('Article.id'), 
    'contain' => array('User.name') 
)); 

Führt diese SQL-Abfrage:

SELECT `Article`.`id`, `User`.`name`, `User`.`id` FROM `articles` AS `Article` LEFT JOIN `users` AS `User` ON (`Article`.`user_id` = `User`.`id`) WHERE `Article`.`is_published` = 1 

und gibt folgende Array:

Array (
    [0] => Array (
     [Article] => Array (
      [id] => 10 
     ) 
     [User] => Array (
      [name] => Author Name 
      [id] => 7 
     ) 
    ) 
    ... 
) 

Welches ist genau das, was erwartet wird. Doch der folgende Aufruf search():

$this->Article->search($query, array(
    'conditions' => array('Article.is_published' => 1), 
    'fields' => array('Article.id'), 
    'contain' => array('Article' => array('User.name')) 
)); 

Führt diese SQL-Abfrage:

SELECT `Article`.`id` FROM `search_index` AS `SearchIndex` LEFT JOIN `articles` AS `Article` ON (`SearchIndex`.`model` = 'Article' AND `SearchIndex`.`association_key` = `Article`.`id`) WHERE `Article`.`is_published` = 1 AND MATCH(`SearchIndex`.`data`) AGAINST('search term' IN BOOLEAN MODE) AND `Article`.`id` IS NOT NULL 

Und gibt dieses Array:

Array (
    [0] => Array (
     [Article] => Array (
      [id] => 9 
     ) 
    ) 
    ... 
) 

bei der Suche Suchen() Methode, es gibt $this->SearchIndex->find('all', $findOptions); zurück. $ findOptions enthält folgende Komponenten:

Array (
    [conditions] => Array (
     [Article.is_published] => 1 
     [0] => MATCH(SearchIndex.data) AGAINST('search term' IN BOOLEAN MODE) 
    ) 
    [fields] => Array (
     [0] => Article.id 
    ) 
    [contain] => Array (
     [Article] => Array (
      [0] => User.name 
     ) 
    ) 
) 

Der Verein ist nicht auf dem Weg verloren gehen, weil innerhalb SearchableBehavior, $this->SearchIndex->Article->belongsTo['User'] vorhanden und intakt ist unmittelbar vor und nach dem Aufruf() in der Suche zu finden() Methode.

Der Aufruf suchen() genau die gleiche Sache für alle folgenden Werte von ‚enthalten‘ liefert:

array('Article' => array('User.name')) 

array('Article' => array('User')) 

array('Article' => array('User' => array())) 

array('Article' => array('User' => array('fields' => array('User.name')))) 

array('Article' => array('User' => array('fields' => array('name')))) 

Bin ich etwas falsch? Ich denke, ich benutze das gleiche Format wie in the CakePHP documentation angewiesen, und ich habe nichts online gefunden, das vorschlägt, dass Sie etwas Besonderes tun müssen, um Suchergebnisse mit zugehörigen Daten zu erhalten.

Ich weiß, dass ich das Ergebnis leicht erreichen könnte, indem ich einfach die Benutzer mit zusätzlichen Aufrufen nach find() suche, aber ich möchte, dass behaltbares Verhalten so funktioniert, wie es soll und unnötigerweise reduziert wird zusätzliche Datenbankabfragen

+0

Danke für den Link! Ich wusste nicht, dass es ein Suchverhalten gab. Ich werde es später überprüfen, ist es nützlich? – metrobalderas

+0

Angeblich. Es macht Volltextsuchen und ist anpassbar, wie es Ihre Daten indiziert, aber ich habe offensichtlich dieses Problem damit, dass es zugeordnete Modelldaten zurückgibt. –

Antwort

1

Wenn contain verwenden, stellen Sie die rekursive Option auf "true"

$this->Model->Behaviors->attach("Containable",array("recursive"=>true)); 
+0

$ this-> Article-> Behaviors-> attach ("Containable", Array ("rekursive" => true)); 'vor dem Aufruf von search() hat die Ausgabe nicht geändert. –

+0

Sie müssen die Verschachtelung der Modelle fortsetzen, die rekursiv ausgegeben werden sollen – John