2

我尝试以下方法来获取属于 MenuItem 6 并且文章 content_type 为“博客”的所有文章。它确实找到了所有带有content_type='blog'. 但我只希望它返回属于 Menuitem 7 的文章。现在它在不是 7 时返回 MenuItem 的空值。

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

MenuItem 与 A​​rticle 具有 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'
            )
        )
    )
      )
 )
4

1 回答 1

2

我认为对于这种类型的查找条件,您最好的选择是修改您的模型以使用hasMany through (The Join Model)。这是我测试的一个示例,可以满足您的要求:

文章.php

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

菜单项.php

class MenuItem extends AppModel {
    public $hasMany = array('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'

我也设置$recursive = -1了我的 AppModel。我建议您也这样做,因为您使用的是可包含的行为,它更有效,因为它只会拉回您需要的数据。:)

希望这会有所帮助,有任何问题请告诉我。

于 2012-08-16T14:03:39.953 回答