从相关表中检索SUM(值)

时间:2011-11-23 01:53:39

标签: cakephp model relationship

我有一个数据库表,让我们说人和每个人都有投票存储在投票表中。

每个人都会有很多选票,其中一些是投票,其中一些是投票,所以我对COUNT不感兴趣。

我有以下查询来检索单个人的投票:

$votes = $this->Vote->query("
  SELECT IFNULL( SUM( value ) , 0 ) AS vote_count
  FROM `votes`
  WHERE person_id = {$person_id}"); 

每次拨打电话

时,我是否可以为个人获取此信息
$this->person->find("all")

1 个答案:

答案 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();