2010-12-09 101 views
2

我試圖使用CakePHP 1.3.5的searchable behavior與中可容納的行爲返回的搜索結果指定模型相關的模型(文章屬於關聯用戶)。獲取CakePHP的搜索行爲導致含有更深協會

忽略了一會兒,以下調用的搜索行爲find()方法

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

執行此SQL查詢:

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 

,並返回下面的數組:

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

這正是預期的。但是,下面的調用搜索()

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

執行此SQL查詢:

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 

,並返回該數組:

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

望着搜索()方法,它返回$this->SearchIndex->find('all', $findOptions);$ findOptions包含以下內容:

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

的關聯沒有得到沿途丟失,因爲裏面SearchableBehavior,$this->SearchIndex->Article->belongsTo['User']存在和完整,立即前後打電話找()搜索()內方法。

調用搜索()返回所有的下列值完全相同的事情「包含」

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')))) 

難道我做錯了什麼?我想我使用的格式與the CakePHP documentation中指示的相同,我還沒有發現任何在線內容,這表明你必須做一些特殊的事情才能獲得帶有關聯數據的搜索結果。

我知道我可以通過查找附加調用find()來查找用戶,從而輕鬆實現我想要的結果,但是我希望獲得可容納的行爲,以便像它應該的那樣工作,並減少不必要的行爲額外數據庫查詢。

+0

感謝您的聯繫!我不知道它存在搜索行爲。我稍後會檢查它,它有用嗎?據推測,這是 – metrobalderas 2010-12-10 16:36:39

+0

。它會進行全文搜索,並且可以根據您的數據索引進行定製,但是我顯然遇到了這個問題,要求它返回相關的模型數據。 – 2010-12-10 17:02:02

回答

1

在使用中容納,設置遞歸選項爲 「true」

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