저는 데이터베이스 테이블이 있습니다. Person과 각 사람이 투표 테이블에 투표를 저장하고 있습니다.관련 테이블에서 SUM (값) 검색
각 사람마다 많은 표를 얻게되며 그 중 일부는 아래로 내려 가고 투표 중 일부는 투표에 관심이 없습니다.
나는 한 사람에 대한 투표를 검색하려면 다음 쿼리가 :
$this->person->find("all")
저는 데이터베이스 테이블이 있습니다. Person과 각 사람이 투표 테이블에 투표를 저장하고 있습니다.관련 테이블에서 SUM (값) 검색
각 사람마다 많은 표를 얻게되며 그 중 일부는 아래로 내려 가고 투표 중 일부는 투표에 관심이 없습니다.
나는 한 사람에 대한 투표를 검색하려면 다음 쿼리가 :
$this->person->find("all")
이 될 수 저 사람을 내가 전화 할 때마다이 정보를 가져올 수 있도록
$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();
이것은 completley 잘못이며 곧 업데이트 될 예정입니다. – going