2011-02-11 31 views
5

我正在使用此查詢,但它不返回ctotal。請幫忙。cakephp查詢中的sum()函數

$total = $this->RequestedItem->find('all', 
    [ 
     'sum(cost * quantity) AS ctotal', 
     'conditions' => [ 
      'RequestedItem.purchase_request_id' => $_GET['po_id'] 
     ] 
    ] 
); 
+0

您可能希望避免直接將$ _GET ['po_id']放入查詢中,即使CakePHP正在爲您清理用戶輸入。 – Dave 2011-02-11 16:38:42

+0

@Dave如果CakePHP已經處理注入,有什麼危害? – 2011-11-02 14:24:45

回答

13

你不應該直接在CakePHP中使用PHP超全局變量。您應該使用Model.field命名,以免發生模棱兩可的字段錯誤。

虛擬領域是要走的路,但這不是你的問題,你需要更多地閱讀這本書。

$total = $this->RequestedItem->find('all', array(array('fields' => array('sum(Model.cost * Model.quantity) AS ctotal'), 'conditions'=>array('RequestedItem.purchase_request_id'=>$this->params['named']['po_id']))); 

應該做工精細,用virtualFields這將是

var $virtualFields = array('total' => 'SUM(Model.cost * Model.quantity)'); 
$total = $this->RequestedItem->find('all', array(array('fields' => array('total'), 'conditions'=>array('RequestedItem.purchase_request_id'=>$this->params['named']['po_id']))); 

領域走在「字段」鍵,就像條件中的「條件」鍵去。見http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find

1

您可以使用virtualFields:

var $virtualFields = array(
    'the_sum' => 'SUM(Model.cost * Model.quantity)' 
); 
6

這工作太適合我

$sum = $this->Modelname->find('all', array(
    'conditions' => array(
    'Modelname.fieldname' => $conditions), 
    'fields' => array('sum(Modelname.fieldname) as total_sum' 
      ) 
     ) 
    ); 
2

工作得很好暫時將virtualFields之前做一個查找。

$this->MaterialScan->virtualFields = array(
    'total_qty' => 'COUNT(MaterialScan.id)', 
    'total_lbs' => 'SUM(MaterialScan.weight)' 
); 
$materialScans = $this->MaterialScan->find('all',array(
    'conditions' => array(
     'MaterialScan.id' => $scans 
    ), 
    'group' => array('MaterialScan.part_number') 
)); 

這可以避免在返回的數組中有[0]個元素。