我有一个数据库表,让我们说人和每个人都有投票存储在投票表中。
每个人都会有很多选票,其中一些是投票,其中一些是投票,所以我对COUNT不感兴趣。
我有以下查询来检索单个人的投票:
$votes = $this->Vote->query("
SELECT IFNULL( SUM( value ) , 0 ) AS vote_count
FROM `votes`
WHERE person_id = {$person_id}");
每次拨打电话
时,我是否可以为个人获取此信息$this->person->find("all")
答案 0 :(得分:0)
可以使用$virtualFields:
完成此操作在投票模型中,我添加以下虚拟字段:
var $virtualFields = array(
'vote_count' => 'IFNULL( SUM( Vote.value ) , 0 )'
);
在Person模型中,我每次都使用以下$ hasMany关系检索它:
var $hasMany = array('Vote' => array('fields' => array('vote_count')));
请注意,默认情况下,它将始终检索Vote表中的每个字段,这将导致默认情况下检索“vote_count”SUM字段,并且如果您要完整地写出查询,则只会按预期显示一行。
如果要检索所有行并删除SUM虚拟字段,则需要在字段数组中指定除“vote_count”字段之外的所有字段(如果需要),例如
var $hasMany = array('Vote' => array('fields' => array('id', 'value')));
我建议通过在Person模型中使用几个函数来更好地控制它,这将允许您即时决定如何检索投票:
function allWithVoteCounts() {
$this->bindModel(array('hasMany' =>
array('Vote' => array(
'fields' => array('vote_count')
)
)
));
return $this->find('all');
}
function allVotes() {
$this->bindModel(array('hasMany' =>
array('Vote' => array(
'fields' => array('id', 'user_id', 'person_id', 'value', 'date')
)
)
));
return $this->find('all');
}
然后在控制器中你可以打电话:
$persons = $this->Person->allVotes();
或
$persons = $this->Person->allWithVoteCounts();