2011-10-25 17 views
0

私は多くのテーマを持つテンプレートを持っています。 クリア十分な私の関係は私がテーマの数とテンプレートを表示したいと私はこのコードを適用しています テンプレートhasManyのテーマになること:モデルを正しく関連付ける方法cakephp

$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番目のテンプレート)のすべてのテーマを数えています。[TemplateTheme] =>配列 ( [0] =>配列 ( [テーマ] => 3 ) 第三のテーマは、実際に2 template.The関係に属し

TEMPLATE_IDは、テンプレートの各テーマを表すために、テーマ・テーブルになっています。

テンプレート1には2つのテーマがあり、テンプレート2には1つのテーマがあり、現在は3つのテーマすべてを1つ目のテンプレートに表示しています。

私はそれがこのよう

templatename1 
count of themes 1st template 

template name 2 
count of themes of 2nd template 

のように私にこれを行うための正しい方法を教えてくださいしたいです。

答えて

0

あなたは、これはあなたが見つける(「数」)メソッドを使用しての代わりに、あなたのような仮想「のカウント」フィールドを使用する必要があります

+0

問題はカウントされていません。問題は各テンプレートのテーマを取得しています。テンプレートは2つのテーマを持ち、テンプレートは2つのテーマを持っています。最初のテンプレートの3つのテーマをすべて表示しています。注目してください。 –

+0

'(この 'の$ this - >テンプレート - > bindModel( 配列( 'hasManyの'=>配列( 'TemplateTheme'=>配列( が 'className'=> 'TemplateTheme'、 'フィールド'=>配列を試してみてください) ) )、偽 ); ' – mentes

+0

問題は正確なデータを取得している問題を数えていません –

0

をしているのに役立ちます

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

希望のようなテーマの配列を数えることができます今やっている。たとえば:

$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

カスタムジョインのようにモデルに参加する方法はありませんか? –

1

あなたは各テンプレートごとのテーマの数を取得したい場合は、最もエレガントな方法はcounterCacheを使用することです。

もう1つの方法は、Containableビヘイビアを使用することです。これは、関連するデータのみを取り出し、PHPでフェッチされたデータ配列を数えます。 あなたはテンプレートモデルに収容可能行動を添付した後、このようないくつかのコードは動作するはずです:

$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']; 
    } 
} 

希望は、この道に沿って、誰かを助けます。

関連する問題