2011-11-23 4 views
0

저는 데이터베이스 테이블이 있습니다. Person과 각 사람이 투표 테이블에 투표를 저장하고 있습니다.관련 테이블에서 SUM (값) 검색

각 사람마다 많은 표를 얻게되며 그 중 일부는 아래로 내려 가고 투표 중 일부는 투표에 관심이 없습니다.

나는 한 사람에 대한 투표를 검색하려면 다음 쿼리가 :

$this->person->find("all") 

답변

0

이 될 수 저 사람을 내가 전화 할 때마다이 정보를 가져올 수 있도록

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

가 가능을 $virtualFields을 사용하여 완료 :

투표 모델에서 다음 가상 필드를 추가합니다.

인격 모델에서
var $virtualFields = array(
    'vote_count' => 'IFNULL(SUM(Vote.value) , 0)' 
); 

나는이에게 다음과 같은 $의 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'))); 

나는이 더 나은 제어 당신이 투표를 검색하는 방법을 즉석에서 결정 할 수 같은 사람 모델의 기능 몇 가지는 것입니다 제안 :

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

이것은 completley 잘못이며 곧 업데이트 될 예정입니다. – going

관련 문제