2012-08-16 73 views
2

我嘗試以下操作以獲取屬於MenuItem 6的文章,並且文章content_type爲'blog'。它確實可以找到content_type='blog'的所有文章。但我只希望它返回文章,如果它屬於Menuitem 7.現在它返回一個空值爲MenuItem,當不是7時。Cakephp查找多個模型上的所有查詢

我該如何做到它只會從MenuItem 7加載文章?

菜單項與第一個HABTM關係

代碼:

$d=$this->Article->find('all' , array('contain' => array(
     'MenuItem' => array(
      'conditions' => array(
       'MenuItem.id ' => 7,   
      ), 
       'fields'=>'id' 
     ), 
     'Tag'=>array(
      'conditions'=>array(
       'Tag.name'=>'tag1' 
      ), 
      'fields'=>'name' 
     ) 
    ), 
     'conditions'=>array('Article.content_type' => 'blog'), 
     'fields'=>array('id','content_type'), 
     'recursive'=>1 
    )); 

    debug($d); 

陣列:

array(
     (int) 10 => array(
    'Article' => array(
     'id' => '15', 
     'content_type' => 'blog' 
    ), 
    'Tag' => array(), 
    'MenuItem' => array() 
), 
    (int) 11 => array(
    'Article' => array(
     'id' => '16', 
     'content_type' => 'blog' 
    ), 
    'Tag' => array(), 
    'MenuItem' => array(
     (int) 0 => array(
      'id' => '7', 
      'MenuItemsArticle' => array(
       'id' => '18', 
       'title' => '', 
       'article_id' => '16', 
       'menu_item_id' => '7' 
      ) 
     ) 
    ) 
    ) 
) 
+0

好問題。我記得一次解決這個問題,但代碼不好。希望有人能給出一個很好的答案。 – 2012-08-16 12:53:43

+0

它需要一個人,所以結果可以分頁 – waterschaats 2012-08-16 13:12:22

回答

2

我覺得這種類型的查找條件最好的辦法是修改模型使用hasMany through (The Join Model)。下面是我測試了一個例子你想要做什麼:

Article.php

class Article extends AppModel { 
    public $hasMany = array('ArticleMenuItem'); 
} 

MenuItem.php

class MenuItem extends AppModel { 
    public $hasMany = array('ArticleMenuItem'); 
} 

ArticleMenuItem.php

class ArticleMenuItem extends AppModel { 
    public $useTable = 'articles_menu_items'; 

    public $belongsTo = array(
     'Article', 
     'MenuItem' 
    ); 
} 

的查找調用

$articles = $this->ArticleMenuItem->find('all', array(
    'conditions' => array(
     'menu_item_id' => 7, 
     'Article.content_type' => 'blog' 
    ), 
    'contain' => array(
     'Article' => array(
      'fields' => array(
       'id', 
       'title' 
      ) 
     ), 
     'Tag' 
    ) 
)); 

下面是它產生:

array(
    (int) 0 => array(
     'ArticleMenuItem' => array(
      'article_id' => '1', 
      'menu_item_id' => '7' 
     ), 
     'Article' => array(
      'id' => '1', 
      'content_type' => 'blog', 
      'title' => 'test blog' 
     ) 
    ), 
    (int) 1 => array(
     'ArticleMenuItem' => array(
      'article_id' => '4', 
      'menu_item_id' => '7' 
     ), 
     'Article' => array(
      'id' => '4', 
      'content_type' => 'blog', 
      'title' => 'another' 
     ) 
    ) 
) 

這裏是它生成查詢:

SELECT `ArticleMenuItem`.`article_id`, `ArticleMenuItem`.`menu_item_id`, `Article`.`id`, `Article`.`content_type`, `Article`.`title` FROM `caketest`.`articles_menu_items` AS `ArticleMenuItem` LEFT JOIN `caketest`.`articles` AS `Article` ON (`ArticleMenuItem`.`article_id` = `Article`.`id`) WHERE `menu_item_id` = 7 AND `Article`.`content_type` = 'blog' 

我已經在我的AppModel設置$recursive = -1以及。我建議同樣使用可容忍的行爲,因爲它只會回拉所需的數據,所以效率會更高。 :)

希望這可以幫助,任何問題只是讓我知道。

+0

謝謝!這看起來非常好,我會嘗試將這個應用於我的情況。 – waterschaats 2012-08-16 14:23:07

+0

讓我知道它是如何:) – Hoff 2012-08-16 14:33:02

+0

它很好,謝謝!我可以減少輸出字段嗎?現在它返回文章表的所有字段 – waterschaats 2012-08-16 14:44:55