CakePHP:加入内部包含

时间:2011-07-14 17:33:58

标签: php cakephp cakephp-appmodel

正如标题所说,我在查找查询中遇到了连接问题,错误显示如下:

  preg_match() expects parameter 2 to be string, array given [CORE/cake/libs/model/behaviors/containable.php, line 301]

我尝试在那里添加joins数组,但它没有改变任何内容。

这些是我传递给find方法的选项。

$options = array(
   'contain' => array(
      'Answer' => array(
         'conditions' => array('Answer.type' => 'answer'),
         'joins' => array(
            $this->votesJoin()
         ),
         'Comment' => array(
            'conditions' => array('Comment.type' => 'comment'),
            'joins' => array(
               $this->votesJoin()
            )
         )
      ),
      'Comment' => array(
         'conditions' => array('Comment.type' => 'comment'),
         'joins' => array(
            $this->votesJoin()
         )
      ),
      'User',
      'Tag' => array()
   ),
   'joins' => array(
      $this->votesJoin()
   ),
   'conditions' => array(
      'Question.id' => $id
   )
);

return $this->find('first', $options);

votesJoin()返回以下数组。

(
   [table] => (SELECT Vote.node_id, SUM(value) as total FROM votes AS `Vote`   WHERE 1 = 1  GROUP BY `Vote`.`node_id`  )
   [alias] => Vote
   [conditions] => Vote.node_id = Question.id
)

我正在尝试做什么: 每个用户可以向上/向下投票节点(问题/答案/评论)。通过加入,我试图添加这些投票的总和。 database http://github.com/navale/QA/wiki/img/datamodel.png

1 个答案:

答案 0 :(得分:1)

您应该仅将“连接”用于Cake模型关系和Containable无法完成的事情。我不知道你的数据库的细节,但我认为可以简化查找操作。你为什么不在这里发布这些表的架构?

试试这个:

$options = array(
'contain' => array(
  'Answer' => array(
     'conditions' => array('Answer.type' => 'answer'),
     'Vote' => array(
        'fields' => array('SUM(Vote.value)'),
        'group'  => array('Vote.parent_id')
     ),
     'Comment' => array(
        'conditions' => array('Comment.type' => 'comment'),
        'Vote' => array(
                        'fields' => array('SUM(Vote.value)'),
                        'group'  => array('Vote.parent_id')
                 )
     )
  ),
  'Comment' => array(
     'conditions' => array('Comment.type' => 'comment'),
     'Vote' => array(
        'fields' => array('SUM(Vote.value)'),
        'group'  => array('Vote.parent_id')
     )
  ),
  'User',
  'Tag' => array()
     

),      'conditions'=>阵列(         'Question.id'=> $ ID      )   );

您可以获得每个答案,评论和评论的投票金额值。 (如果还没有完成,可能需要在Node模型中添加'hasMany'投票)

如果您希望获得一个投票的总和,那么我建议: 获取问题的答案和评论列表:

  

$ lvl1 = find('list','fields'=> array('id'),'conditions'=> array('Node.parent_id'=> $ id))

然后获取答案评论列表

  

$ lvl2 = find('list','fields'=> array('id'),'conditions'=> array('Node.parent_id'=> $ lvl1))

然后只需合并2个数组,然后对其进行求和。