2011-11-23 26 views
0

我有一个数据库表,可以说Person和每个人都有投票存储在投票表中。从相关表中检索SUM(值)

每个人都会有很多选票,其中一些已经到了,其中一些是倒票,所以我对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

这可能是使用$virtualFields

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

var $virtualFields = array(
    'vote_count' => 'IFNULL(SUM(Vote.value) , 0)' 
); 

在Person模型我这个检索使用以下$的hasMany关系,每次:

var $hasMany = array('Vote' => array('fields' => array('vote_count'))); 

注意,默认情况下,它会永远在投票表中检索每一个领域,这将导致检索'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(); 
+0

这是完全错误的,将尽快更新 – going