Как правильно связать модели CakePHP - PullRequest
0 голосов
/ 25 октября 2011

У меня есть сценарий, где у меня есть шаблоны, которые имеют много тем. Достаточно ясно, что мое отношение будет шаблон hasmany themes Я хочу показать шаблон с количеством тем и применяю этот код:

$this->Template->recursive = 2;
     $this->Template->bindModel(
                         array(
                          'hasMany' =>array(
                            'TemplateTheme'=>array(
                               'className'=>'TemplateTheme',
                               'fields'  => 'count(TemplateTheme.id) AS themes'
                           )
                          )
                      ),false
   );
   $this->paginate = array(
                      'order' => array('Template.modified DESC'),
                      'limit' =>$limit
                    );   
     $template = $this->paginate('Template');
     pr($template);die();

но я получаю

Array
(
    [0] => Array
        (
            [Template] => Array
                (
                    [id] => 1
                    [name] => churchDesign
                    [status] => Active
                    [created] => 2011-10-24 10:37:23
                    [modified] => 2011-10-25 15:16:46
                )

            [TemplateTheme] => Array
                (
                    [0] => Array
                        (
                            [template_id] => 1
                            [TemplateTheme] => Array
                                (
                                    [0] => Array
                                        (
                                            [themes] => 3
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [Template] => Array
                (
                    [id] => 2
                    [name] => blossoms
                    [status] => Active
                    [created] => 2011-10-19 00:00:00
                    [modified] => 2011-10-24 14:05:27
                )

            [TemplateTheme] => Array
                (
                )

        )

) 

Проблема здесь в том, что он считает все темы в первом массиве (1-й шаблон) .see [TemplateTheme] => Array ( [0] => Массив ( [themes] => 3 ) третья тема фактически принадлежит второму шаблону. Отношение

template_id находится в таблице тем для представления каждой темы для шаблона.

Шаблон 1 имеет 2 темы, а шаблон 2 имеет одну тему, и в настоящее время в нем отображаются все три темы в первом шаблоне.

я хочу вот так

templatename1
count of themes 1st template

template name 2
count of themes of 2nd template

Пожалуйста, скажите мне правильный способ сделать это.

Ответы [ 3 ]

1 голос
/ 09 мая 2012

Если вы хотите получить количество тем для каждого шаблона, самый элегантный способ - использовать counterCache .

Другой способ - использовать поведение Containable, которое выбирает толькосвязанные данные, которые вы хотите, а затем подсчитать массив извлеченных данных в PHP.После того, как вы добавите сдерживаемое поведение к модели Template, должен сработать такой код:

$allTemplates = $this->Templates->find('all', array(
                      'contain' => 'TemplateTheme.name'
                 ));
foreach($allTemplates as $template){
    $currentThemeCount = count($template['TemplateTheme']);
    foreach($template['TemplateTheme'] as $theme){
         echo $theme['name'];
    }
}

Надеюсь, что это поможет кому-то на этом пути.

0 голосов
/ 27 октября 2011

Вы должны использовать метод find ('count') вместо использования виртуального поля 'count', как вы делаете сейчас.Например:

$allTemplates = $this->Template->find('all');
foreach($allTemplates as $data) {
    $templateCount = $this->Template->TemplateTheme->find('count', array(
        'conditions' => array(
            'TemplateTheme.template_id' => $data['Template']['id']
        )
    ));
    // $templateCount should now contain the count of this specific template. Foreach will continue recursion for all others.
}
0 голосов
/ 25 октября 2011

Вы можете считать массив тем как

foreach($template as $t){
    count($t['TemplateTheme'])
}

надеюсь, это поможет

...