У меня есть объект 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);