jueves, 20 de octubre de 2011

Sumar campos en Cakephp y retornar la suma

Lo primero que se me ocurrió para resolver este problema era hacer una consulta find('list), y luego recorrer el arreglo sumando en una variable acumuladora y devolver el resultado.
Esto es sencillo pero resulta poco elegante.

Una mejor solución es incluir en la búsqueda una función de MySQL  y tumar los resultados directamente desde la búsqueda.
Y ya que únicamente necesito un valor, en lugar de find, uso la función field que devuelve un único valor en lugar de un array.

para resumir la cosa quedaría así.


$params = array('equipo_id'=>$equipo_id, 'numero_equipo'=>$numero, 'obra_id'=>$obra_id, 'fecha >'=>$fecha_ini, 'fecha <'=>$fecha_fin);
        $datos = $this->field('SUM(total)', $params  );
return $datos;
Aquí el truco es poner SUM('campo') ya que si la consulta, según las condiciones retorna varios campos, se suman y se devuelve únicamente el resultado.
Si se pone como parámetro de field, simplemente el nombre del campo, retornará la primera coincidencia si alguna.

2 comentarios:

  1. hola me gustaria hacer lo mismo el problema q tengo un cliente y una facturaventa en tablas diferentes necesito q me calcule el monto total de facturaventas where cliente = X
    please

    ResponderEliminar
  2. $opclients = array(
    'recursive' => -1,
    'fields' => array('id','rfc','name')
    );
    $clientes=$this->Client->find('all', $opclients);
    $tot_clients=count($clientes);
    $ingresos= array();
    //$conditions = array();
    //$conditions[] = array('Invoice.sub_type' => '1');
    for($i=0; $i<$tot_clients; ++$i){
    $id=$clientes[$i]['Client']['id'];
    $params = array('client_id'=>$id, 'sub_type'=>'1');
    $clientes[$i]['Client']['ingresos'] = $this->Invoice->field('SUM(total)', $params );
    }
    debug($clientes); exit();

    ResponderEliminar