2011-06-14 16 views
7

Tengo una entidad InvoiceItem así:clave externa con la consulta DQL

/** 
* @Entity 
*/ 
class InvoiceItem 
{ 
    [..] 

    /** 
    * @ManyToOne(targetEntity="Invoice", inversedBy="items") 
    * @JoinColumn(name="invoice_id", referencedColumnName="id") 
    * @var Invoice 
    */ 
    private $invoice; 

    /** 
    * @Column(type="decimal", scale="10", precision="3") 
    * @var float 
    */ 
    private $qty; 

    /** 
    * @Column(name="unit_price", type="decimal", scale="10", precision="3") 
    * @var float 
    */ 
    private $unitPrice; 

    [..] 
} 

me gustaría devolver una matriz donde la clave será la identificación de la factura y el valor de la suma de Cant * precio unitario.

puedo devolver la suma con una consulta DQL como esto:

SELECT SUM(I.qty * I.unitPrice) AS amount FROM Entities\\InvoiceItem I 
WHERE I.invoice IN (..) GROUP BY I.invoice 

El resultado:

array(
    0 => array('amount' => '46.7'), 
    1 => array('amount' => '32.5') 
) 

Pero no sé cómo devolver la clave externa de la factura. He intentado

SELECT SUM(I.qty * I.unitPrice) AS amount, I.invoice 
FROM Entities\\InvoiceItem I 
WHERE I.invoice IN (..) GROUP BY I.invoice 

Pero no funciona (error:. PathExpression no válida Debe ser un StateFieldPathExpression.)

¿Cómo puedo devolver el ID de factura? Y me gusta usar la ID como la clave de mi campo de resultados:

array(
    1005 => '46.7', 
    1250 => '32.5' 
) 

en 1005 y 1250 corresponden a la identificación de las facturas.

actualización 2011-06-15

consulta nativa funciona:

$rsm = new \Doctrine\ORM\Query\ResultSetMapping(); 
    $rsm->addScalarResult('invoice_id', 'invoiceId'); 
    $rsm->addScalarResult('amount', 'amount'); 
    $q = $this->getEntityManager()->createNativeQuery(
     'SELECT invoice_id, SUM(qty * unit_price) AS amount FROM invoices_items' 
      .' WHERE invoice_id IN ('.implode(',', $ids).') GROUP BY invoice_id', 
     $rsm 
    ); 
    $result = $q->getResult(); 

el resultado:

array(
    0 => 
    array(
     'invoiceId' => '1005', 
     'amount' => '46.7' 
    ) 
    1 => 
    array(
     'invoiceId' => '1250', 
     'amount' => '32.5' 
    ) 
) 

pero necesito hacer un bucle para el índice de la factura ID .

Respuesta

9

Puede usar el método setHint() para hacer que la clave externa se devuelva con el resto de los valores de su entidad. Aplicar el método de la consulta (no el QueryBuilder):

$q = $qb->getQuery(); 
$q->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true); 
+0

Por lo que yo sé, que tendrá que acaba de obtener los resultados a continuación, recorrer ellas la creación de una nueva matriz para obtener su ID de factura para actuar como la tecla de matriz –

+0

HINT_INCLUDE_META_COLUMNS funciona, pero necesito incluir al menos uno de los campos: SELECT SUM (I.qty * I.unitPrice) AS amount, PARCIAL I. {id} ... – Maxence

+0

Cierto, no creo que exista de todos modos Alrededor de eso. –

Cuestiones relacionadas