Cakephp намира всички заявки за множество модели

Опитвам следното, за да получа всички статии, които принадлежат към MenuItem 6 и имат тип content_статия на 'blog'. Намира всички статии с content_type='blog'. Но искам само да върне статията, ако принадлежи към Menuitem 7. И сега връща празна стойност за MenuItem, когато не е 7.

Как мога да постигна, че ще зарежда само статиите от MenuItem 7?

MenuItem има HABTM връзка с Article

код:

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

person waterschaats    schedule 16.08.2012    source източник
comment
Добър въпрос. Спомням си, че реших този проблем веднъж, но с лош код. Надявам се някой да даде добър отговор.   -  person L. Sanna    schedule 16.08.2012
comment
Трябва да е едно по едно, за да могат резултатите да бъдат пагинирани   -  person waterschaats    schedule 16.08.2012


Отговори (1)


Мисля, че най-добрият ви залог за този тип условие за намиране е да модифицирате моделите си така, че да използват hasMany through (Моделът за присъединяване). Ето един пример, който тествах и който прави това, което искате:

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 = -1 и в моя AppModel. Бих предложил да направите същото, тъй като използвате поведението за задържане, то е много по-ефективно, защото изтегля само данните, от които се нуждаете. :)

Надявам се това да помогне, ако имате въпроси, просто ме уведомете.

person Hoff    schedule 16.08.2012
comment
Благодаря! Това изглежда много добре, ще се опитам да го приложа към моята ситуация. - person waterschaats; 16.08.2012
comment
Работи чудесно, благодаря! Мога ли да намаля изходните полета? Сега връща всички полета на таблицата Статия - person waterschaats; 16.08.2012
comment
Статията също има свързан с нея етикет (HABTM), мога ли да получа и тях в масива? - person waterschaats; 16.08.2012
comment
Актуализирах извикването за намиране, за да ви покажа как да зададете полета и да включите таговете. Предлагам да прочетете за контейнерното поведение, наистина е лесно за използване. Освен това не забравяйте да маркирате това като отговор, ако отговаря на въпроса ви :) - person Hoff; 16.08.2012
comment
Благодаря ти много! Трябва ли да прикача поведението Coontainable към ArticleMenuItem, за да накарам това да работи? - person waterschaats; 16.08.2012
comment
Прикачете го във вашия AppModel: public $actsAs = array('Containable'); - person Hoff; 16.08.2012