2011-02-11 12 views
5

Estoy usando esta consulta, pero no está devolviendo ctotal. Por favor ayuda.función sum() en la consulta cakephp

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

Probablemente quiera evitar poner $ _GET ['po_id'] en una consulta directamente, incluso si CakePHP está borrando la entrada del usuario por usted. – Dave

+0

@Dave si CakePHP ya maneja la inyección, ¿cuál es el daño? –

Respuesta

13

No deberías estar usando superglobales PHP directamente en CakePHP. En su lugar, debe usar la denominación Model.field para no obtener errores de campo ambiguos.

Los campos virtuales son el camino a seguir, pero ese no es su problema, necesita leer el libro un poco más.

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

debería funcionar bien, con los virtualFields sería

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

Los campos que van en la tecla 'campos', al igual que las condiciones van en la tecla 'condiciones'. Ver http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find

1

Puede utilizar virtualFields:

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

full_name eh ... – dogmatic69

+0

: P cambió el nombre –

6

Esto funciona también, trabajado bien para mí

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

Temporalmente establece la virtualFields antes de hacer un hallazgo.

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

Esto evita tener los elementos [0] en la matriz devuelta.