2012-10-28 65 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 

如果我嘗試執行它作爲一個自定義查詢蛋糕轉換結果以這樣的方式,這將需要大量的數組操作是可用的。我試着做它用下面的代碼蛋糕的方式,但由於某些原因,計算字段在一個單獨的陣列從而導致在視圖奇怪的行爲結束了:

$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()); 

產生以下結果:

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' 
     ) 
    ) 
) 

有沒有人有任何想法獲得計算點擊計數顯示在項目數組下?

回答

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 ELSE 1 0 END)' , \t \t 'clicks_not_redirected'=> 'SUM(CASE WHEN Click.redirect_url = Project.url THEN ELSE 0 1 END)' \t);' – Ted

+0

是否有可能定義虛擬字段僅對於特定的方法?當我添加虛擬領域的模型,打破了所有其他方法。 – Ted

相關問題