Cakephp在多个模型上查找所有查询

时间:2012-08-16 12:06:08

标签: cakephp cakephp-2.0 models containable

我尝试以下方法来获取属于MenuItem 6的文章,并且文章内容类型为“博客”。它找到了content_type='blog'的所有文章。但我只希望它返回文章,如果它属于Menuitem 7.现在它返回一个空值的MenuItem不是7.

我怎样才能完成它只会从MenuItem 7加载文章?

MenuItem与文章

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

1 个答案:

答案 0 :(得分: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。我建议你做同样的事情,因为你使用可包含的行为,它更有效,因为它只会回收你需要的数据。 :)

希望这有帮助,任何问题只是让我知道。