【问题标题】:Return foreign key with DQL query使用 DQL 查询返回外键
【发布时间】:2011-06-14 08:13:14
【问题描述】:

我有一个像这样的 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;

    [..]
}

我想返回一个数组,其中键是发票的 ID,值是 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 

但它不起作用(错误:无效的 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 进行索引。

【问题讨论】:

    标签: php mysql doctrine-orm


    【解决方案1】:

    您可以使用 setHint() 方法使外键与实体的其余值一起返回。您将该方法应用于查询(而不是查询构建器):

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

    【讨论】:

    • 据我所知,您只需获取结果,然后循环遍历它们,创建一个新数组,让您的发票 ID 充当数组键。
    • HINT_INCLUDE_META_COLUMNS 有效,但我需要包括至少一个字段:SELECT SUM(I.qty * I.unitPrice) AS amount, PARTIAL I.{id} ...
    • 是的,我不认为有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2020-06-22
    • 2011-11-08
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多