2011-06-14 77 views
7

我有一個InvoiceItem實體是這樣的:返回外鍵與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; 

    [..] 
} 

我想返回一個數組,其中的關鍵是發票的id和值數量的總和* 單價。

我可以用DQL這樣的查詢返回的總和:

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

結果:

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

但我不知道怎麼回的發票外鍵。我試過

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

但它不工作(錯誤:無效PathExpression必須是StateFieldPathExpression。)

我怎樣才能返回發票ID?我想用ID作爲我的結果數組的鍵:

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

其中1005和1250是發票的ID。

更新2011-06-15

本地查詢工作:

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

結果:

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

但我需要憑發票ID進行一個循環的索引。

回答

9

您可以使用setHint()方法使外鍵與您實體的其餘值一起返回。您應用的方法來查詢(不是QueryBuilder的):

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

據我所知,你必須通過他們創建一個新的陣列來獲得您的發票編號爲採取行動,只是得到的結果,然後循環數組鍵。 – 2011-06-14 19:15:31

+0

HINT_INCLUDE_META_COLUMNS工作,但我需要包括至少一個字段:SELECT SUM(I.qty * I.unitPrice)AS amount,PARTIAL I. {id} ... – Maxence 2011-06-15 05:46:15

+0

是的,我不認爲有反正在那附近。 – 2011-06-15 13:28:40