2012-10-28 2 views
0

저는 계산 된 필드를 CakePHP의 모델에 추가하는 방법을 알아 내려고했습니다. 나는 다음과 같은 쿼리를 사용하여 원하는 결과를 얻을 수 있어요 :CakePHP : 다른 모델의 계산 된 필드를 모델에 결합하기

SELECT project_id, 
    COUNT(*) AS clicks_total, 
    SUM(CASE WHEN clicks.redirect_url = projects.url THEN 1 ELSE 0 END) AS clicks_redirected, 
    SUM(CASE WHEN clicks.redirect_url = projects.url THEN 0 ELSE 1 END) AS clicks_not_redirected 
FROM clicks 
LEFT JOIN projects ON clicks.project_id = projects.id 
GROUP BY project_id 

나는 사용자 지정 쿼리 케이크로 실행하려고하면 그것을 사용할 수있을 정도 배열 조작을 필요로하는 방식으로 결과를 변환합니다. 나는 그것을 다음 코드로 케이크 방법을 시도하지만, 어떤 이유로 계산 된 필드가보기에 이상 동작이 발생합니다 별도의 배열에 결국 :

array(
    (int) 0 => array(
     'Project' => array(
      'id' => '508705c8-126c-48f9-bd9a-6d79d13bb9ea', 
      'name' => 'Test Project', 
      'url' => 'http://www.test.com', 
      'url_mac' => 'http://www.mac.com', 
      'url_mobile' => 'http://www.mobile.com' 
     ), 
     (int) 0 => array(
      'clicks_total' => '80', 
      'clicks_redirected' => '35', 
      'clicks_not_redirected' => '45' 
     ) 
    ), 
    (int) 1 => array(
     'Project' => array(
      'id' => '508b1073-2aa8-4895-b8d9-152ed13bb9ea', 
      'name' => 'Another Project', 
      'url' => 'http://another.com', 
      'url_mac' => 'http://anothermac.com', 
      'url_mobile' => 'http://anothermobile.com' 
     ), 
     (int) 0 => array(
      'clicks_total' => '134', 
      'clicks_redirected' => '70', 
      'clicks_not_redirected' => '64' 
     ) 
    ) 
) 
:

$this->paginate = array(
'Project' => array(
    'fields' => array(
     'id', 'name', 'url', 'url_mac', 'url_mobile', 
     'COUNT(*) AS clicks_total', 
     'SUM(CASE WHEN Click.redirect_url = Project.url THEN 1 ELSE 0 END) AS clicks_redirected', 
     'SUM(CASE WHEN Click.redirect_url = Project.url THEN 0 ELSE 1 END) AS clicks_not_redirected' 

     ), 
    'joins' => array(
     array(
      'table' => 'clicks', 
      'alias' => 'Click', 
      'type' => 'LEFT', 
      'conditions' => array('Click.project_id = Project.id') 
     ) 
    ), 
    'group' => 'project_id' 
)); 

$this->set('projects', $this->paginate()); 

는 다음과 같은 결과를 생성합니다

계산 된 클릭 수를 얻는 데 도움이되는 아이디어가 있습니까?

답변

1

당신은 모델에 가상 필드를 추가 할 수 있습니다 :

그것을 체크 아웃 : http://book.cakephp.org/1.3/view/1608/Virtual-fields

프로젝트 모델에서 :

공공 $ virtualFields = 배열 ​​('clicks_total'=> 'COUNT을 (*) ');

+0

굉장합니다. – Ted

+0

'공개 = $ virtualFields 어레이 ( \t \t 'clicks_total'=> 'COUNT (*)' \t \t 'clicks_redirected'=> 'SUM (CASE WHEN Click.redirect_url = Project.url THEN 1 ELSE 0 END)' , \t \t는 => 'SUM (CASE WHEN Click.redirect_url = Project.url THEN 0 ELSE 1 END)'clicks_not_redirected ' \t)' – Ted

+0

단지 특정 방법 가상 필드를 정의 할 수있다? 가상 필드를 다른 모든 방법을 위반 한 모델에 추가했을 때. – Ted

관련 문제