2016-04-26 78 views
5

我有一个表邮政,这有一个具有一对多协会与表计数在包含CakePHP的3

我可以使用所有相关的数据:

$this->Posts->find()->contain(['Stars']); 

行之有效。

但我想数星星。我曾经试过,但它不工作:

$this->Posts->find->contain([ 
    'Stars' => function($q) { 
     return $q->select(['total' => $q->func()->count('Stars.post_id')]); 
    } 
]); 

//I've also tried this 
... 
...$q->select(['total' => "COUNT(Stars.post_id)"]); 
... 
//Also fail 

这不会返回相关的星数。

是否有问题或应该以其他方式做?

谢谢

+0

“_doesn't work_”不是一个合适的问题描述!即使问题对于了解CakePHP内部的人来说可能是显而易见的,请始终尽可能具体说明_exactly_发生了什么,以及您期望发生什么。显示您正在使用的数据,上下文,您的调试尝试以及可能的错误。收集这些信息时,问题通常会自行解决。 – ndm

回答

9

你必须也选择外键否则蛋糕是不能够加入表。而且你也对结果进行分组

'Stars' => function($q) { 
    $q->select([ 
     'Stars.post_id', 
     'total' => $q->func()->count('Stars.post_id') 
    ]) 
    ->group(['Stars.post_id']); 

    return $q; 
} 
+0

这正是我想要的。..谢谢... – Willian

+0

'group()'函数中缺少''''大括号。请更新它。 @arilia –

+0

@SumonSarker我编辑过,但如果你想要 – arilia

-1

试试这个:

$total = $this->Posts->find()->contain(['Stars'])->count(); 

由于吹罚的cookbook

0

正如在这里我们使用的总虚拟领域,可以在同一个模型创造出更多的像这样的:

public function index() 
    { 
     $checklist = TableRegistry::get('Checklists'); 
     $query = $checklist->find() 
      ->where('Checklists.is_deleted = 0') 
      ->contain([ 
       'ChecklistTitles' => function($q) { 
        return $q -> select([ 
         'ChecklistTitles.title', 
         'ChecklistTitles.checklist_id' 
       ]); 

      }, 
       'ChecklistTypes' => function($w){ 
        return $w->select(['ChecklistTypes.type']); 
      }, 
       'AssignedChecklists' => function($e){ 
          $e->select([ 
           'AssignedChecklists.checklist_id', 
           'completed' => $e->func() 
        ->count('AssignedChecklists.checklist_id'), 
         ]) 
         ->group(['AssignedChecklists.checklist_id']) 
         ->where(['AssignedChecklists.is_deleted = 0 AND AssignedChecklists.checklist_status = 2']); 
        return $e; 
       } 
       ]); 
     // ->toArray(); 
     // pr($query);die; 
       $this->paginate = [ 
      'limit' => 20, 
      'sortWhitelist' => [ 
       'id', 'checklist_title', 'checklist_type' 
      ] 
     ]; 
     $this->set('query', $this->paginate($query)); 
     $this->set(compact('checklists','query')); 
     $this->set('_serialize', ['checklists','query']); 

    } 

正如我在这里已经计算完毕,我要计算与不同的地方条件取消,什么将在cakephp3中的语法?