2013-01-22 2 views
2

다음 쿼리는 적절한 ID가 포함 된 배열을 반환하지만 모든 값에 대해 null입니다.CakePHP findList가 집약 된 값을 반환하지 않습니다.

집계 함수 (AVG())를 제거하면 값을 반환합니다 (예 : 평균화 된 값). find('all') 평균을 반환하지만 내가 원하는 목록 형식이 아닙니다 (나는 그걸로 작업 할 수는 있지만, 먼저 'list'으로 해보려고합니다).

$progress = $this->Trial->find('list', array(
    'fields' => array(
     'Trial.session_id', 
     'AVG(Trial.first_reaction_time_since_probe_shown) AS average_reaction_time' 
    ), 
    'group' => 'Trial.session_id', 
    'conditions' => array(
     'Trial.first_valid_response = Trial.probe_on_top', 
     'TrainingSession.user_id IS NOT NULL' 
    ), 
    'contain' => array(
     'TrainingSession' => array(
      'conditions' => array(
       'TrainingSession.user_id' => $this->Auth->user('id') 
      ) 
     ) 
    ), 
    'recursive' => 1, 
)); 

생성 된 SQL 쿼리는 PhpMyAdmin을 통해 DB로 보낼 ​​때 원하는 결과를 정확하게 반환합니다.

SELECT 
    `Trial`.`session_id`, 
    AVG(`Trial`.`first_reaction_time_since_probe_shown`) AS average_reaction_time 
FROM 
    `zwang`.`trials` AS `Trial` 
LEFT JOIN 
    `zwang`.`training_sessions` AS `TrainingSession` ON (
     `Trial`.`session_id` = `TrainingSession`.`id` AND 
     `TrainingSession`.`user_id` = 1 
    ) 
WHERE 
    `Trial`.`first_valid_response` = `Trial`.`probe_on_top` 
GROUP BY 
    `Trial`.`session_id` 

나는 the source for find('list')을 검사했습니다. 쿼리에서 함수를 사용할 때 목록에 액세스하기위한 "배열 경로"가 엉망이라고 생각하지만 아직 해결할 수 없습니다 (또는 CakePHP 논리의 남용을 인식 할 수 없음).

답변

2

질문을 올리면 Stackoverflow가 correct answers을 나와 연결하기 시작했습니다.

분명히 'list'virtualFields 없이는 수행 할 수 없습니다.
다른 검색 유형을 사용했기 때문에 예상하지 못했습니다.

$this->Trial->virtualFields = array(
    'average_reaction_time' => 'AVG(Trial.first_reaction_time_since_probe_shown)' 
); 
$progress = $this->Trial->find('list', array(
    'fields' => array('Trial.session_id','average_reaction_time') 
    /* etc... */ 
)); 
+1

읽기 쉽도록 질문/답변을 포맷하십시오 (당신이있는 경우에 있지 - 당신의 자신의 대답을 받아 들일 =)) – AD7six

+0

@ AD7six 자신의 대답을 받아들이에 이일 블록이있다. 누군가 내가''list''에 가상 필드를 사용해야하는 이유를 말할 수는 있지만''all''을 위해서가 아니라면 더 나은 대답을 할 수 있습니다. – Ruben

+0

계산 된 필드에 대해 가상 필드를 사용하거나 사용하지 않고 find ('all')'에서 반환 한 데이터 배열을 비교하면 대답을 얻을 수 있습니다. – ADmad

관련 문제