Cakephp 从相关表检索总和(值)

Cakephp 从相关表检索总和(值),cakephp,model,relationship,Cakephp,Model,Relationship,我有一个数据库表,比如说Person,每个人的投票都存储在投票表中 每个人都会有很多票,其中一些是上升票,一些是下降票,所以我对计数不感兴趣 我有以下查询来检索单个人的投票: $votes = $this->Vote->query(" SELECT IFNULL( SUM( value ) , 0 ) AS vote_count FROM `votes` WHERE person_id = {$person_id}"); 每次我打电话给某人时,我是否可以为他获取这些信

我有一个数据库表,比如说Person,每个人的投票都存储在投票表中

每个人都会有很多票,其中一些是上升票,一些是下降票,所以我对计数不感兴趣

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

$votes = $this->Vote->query("
  SELECT IFNULL( SUM( value ) , 0 ) AS vote_count
  FROM `votes`
  WHERE person_id = {$person_id}"); 
每次我打电话给某人时,我是否可以为他获取这些信息

$this->person->find("all")
这可以通过以下方式实现:

在投票模型中,我添加了以下虚拟字段:

var $virtualFields = array(
    'vote_count' => 'IFNULL( SUM( Vote.value ) , 0 )'
);
在Person模型中,我每次都通过使用以下$hasMany关系来检索它:

var $hasMany = array('Vote' => array('fields' => array('vote_count')));
请注意,默认情况下,它将始终检索投票表中的每个字段,这将导致在默认情况下检索“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();