2011-02-11 17 views
5

Bu sorguyu kullanıyorum, ancak ctotal döndüremiyor. Lütfen yardım et.cakephp sorgusunda sum() işlevi

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

Muhtemelen CakePHP sizin için kullanıcı girdisini ovuyor olsa bile, $ _GET ['po_id'] 'i doğrudan bir sorguya koymaktan kaçınmak isteyebilirsiniz. – Dave

+0

@ CakePHP'nin zaten enjeksiyon yapıp yapmadığını kontrol edin, zarar nedir? –

cevap

13

doğrudan CakePHP'de PHP superglobals kullanarak olmamalıdır. Belirsiz alan hataları elde etmemek için Model.field adlarını kullanmalısınız.

Sanal alanlar gitmek için bir yoldur, ancak bu sizin sorununuz değil, kitabı biraz daha okumalısınız.

$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']))); 

, iyi çalışması gerekir virtualFields ile bu

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

Alanlar koşulları 'koşullar' anahtarında gitmek gibi, 'alanlar' anahtarında gitmek olurdu. Bu da çalışır http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find

1

Sen virtualFields kullanabilirsiniz:

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

full_name eh ... – dogmatic69

+0

: P adı değiştirildi –

6

Bkz geçici bulunan bir şeyi yapmaya virtualFields önce ayarlanmış bana

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

için çalışıyor.

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

Bu, döndürülen dizide [0] öğelerine sahip olmayı önler.