Возвращать внешний ключ с помощью DQL-запроса

У меня есть объект InvoiceItem следующим образом:

/** * @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; [..] } 

Я хотел бы вернуть массив, где ключ будет идентификатором счета, а значение – суммой qty * unitPrice.

Я могу вернуть сумму с помощью 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 

Но это не работает (ошибка: Invalid PathExpression. Должен быть StateFieldPathExpression.)

Как я могу вернуть идентификатор счета? И я хотел бы использовать ID как ключ моего массива результатов:

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

где 1005 и 1250 являются идентификаторами счетов.

Обновление 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' ) ) 

Но мне нужно сделать цикл для индексации по идентификатору счета.

Вы можете использовать метод setHint (), чтобы вернуть внешний ключ с остальными значениями для вашего объекта. Вы применяете метод к запросу (а не к строителю запросов):

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