2011-11-23 68 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