2

MenuItem 6に属し、Articlecontent_typeが'blog'であるすべての記事を取得するには、次のことを試みます。ですべての記事を検索しますcontent_type='blog'。ただし、Menuitem 7に属している場合にのみ、Articleを返したいのですが、7でない場合はMenuItemに空の値を返します。

MenuItem 7からの記事のみをロードするようにするにはどうすればよいですか?

MenuItemはArticleと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(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'

$recursive = -1AppModelも設定しました。包含可能な動作を使用しているので、同じことを行うことをお勧めします。必要なデータのみをプルバックするため、はるかに効率的です。:)

これがお役に立てば幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-08-16T14:03:39.953 に答える