正如标题所说,我在查找查询中遇到了连接问题,错误显示如下:
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
答案 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个数组,然后对其进行求和。