我在cakephp中有两个模型,Link和Vote。
我想获得Link模型中每个链接的投票总和。 这是我的findAll函数的打印:
[1] => Array
(
[Link] => Array
(
[id] => 1
[url] => http://www.google.com
[date_added] => 2010-08-19 11:36:56
[valid] => 1
)
[Vote] => Array
(
[0] => Array
(
[link_id] => 1
[user_id] => 0
[vote] => 3
)
[1] => Array
(
[link_id] => 1
[user_id] => 4
[vote] => 4
)
)
)
我想要的是这个(注意投票属性):
[1] => Array
(
[Link] => Array
(
[id] => 1
[url] => http://www.google.com
[date_added] => 2010-08-19 11:36:56
[valid] => 1
[votes] => 7
)
[Vote] => Array
(
[0] => Array
(
[link_id] => 1
[user_id] => 0
[vote] => 3
)
[1] => Array
(
[link_id] => 1
[user_id] => 4
[vote] => 4
)
)
)
但我不知道我应该在哪里做投票的总和。
答案 0 :(得分:0)
您可以在Link模型中创建虚拟字段“votes”。 http://book.cakephp.org/view/1608/Virtual-fields
var $virtualFields = array(
'votes' => 'COUNT ...'
);
答案 1 :(得分:0)
尝试使用CakePHP counterCache Sum of a field with hasMany in cakephp
1)在表'links'中添加新字段 - links.vote_count
2)
<?php class Vote extends AppModel {
var $belongsTo = array(
'Link' => array('counterCache' => true)
);}
?>
3)从现在开始,每次添加或删除与Link关联的投票时,vote_count中的数字都会自动调整。
答案 2 :(得分:0)
我知道这是2010年的一个主题,但我在这方面遇到了很多麻烦,这也是Google的第一个结果。
另一种选择是在父链接模型中使用afterFind,如下所示:
public function afterFind($results, $primary = false) {
if(($this->findQueryType=='count') || $primary == false) return $results;
foreach ($results as $key => $val) {
if(isset($val['Vote'])) {
$votes = Hash::extract($val, 'Vote.{n}.vote');
$results[$key]['Link']['votes'] = array_sum($votes);
}
}
return $results;
}
现在,只要你在返回投票对象的链接上执行find()(例如,当使用&#39;包含&#39;来调用查找时),你的链接对象将包含投票总和。