2012-08-16 72 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