通过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\",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编制索引。     

解决方法

        您可以使用setHint()方法使外键与您实体的其余值一起返回。您将方法应用于查询(而不是querybuilder):
$q = $qb->getQuery();
$q->setHint(\\Doctrine\\ORM\\Query::HINT_INCLUDE_META_COLUMNS,true);
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...