Symfony2应用程序中的DQL复杂查询

时间:2013-06-27 08:55:29

标签: sql symfony dql

我的模型中有这种情况:

产品属于类别。 TransactionDetail有产品,价格和数量。 交易有TransactionDetails和日期。 商店有交易。 集团有商店。

他们是Doctrine实体,他们是正确相关的。 (我不粘贴类,它会太长了。)

我需要查询模型以获得销售的总产品(SUM TransactionDetail.quantity)和总金额(SUM TransactionDetail.quantity * TransactionDetail.prize),按产品分组,从产品的交易中获取在一系列日期中发生的特定组中的类别。

好的,我在纯SQL中做了这个,它就像是

select TransactionDetail.product, SUM(TransactionDetail.quantity) as quantity, SUM(TransactionDetail.quantity*TransactionDetail.prize) as euros
from TransactionDetail 
left join Transaction 
on TransactionDetail.transaction = Transaction.id 
left join Product 
on TransactionDetail.product = Product.id 
left join Group 
on Transaction.shop = Group.shop 
where Product.category = :paramCategoryId 
and Group.id = :paramGroupId 
group by TransactionDetail.product

问题是我没有关于如何将它放在DQL查询中的IDEA(因为不推荐使用纯SQL,我真的希望更好地理解DQL的功能)。

你们能帮助我吗?

提前致谢。

=============================================== ==============================
编辑:

最先进的查询:

SELECT d, p, 
SUM(d.quantity) as quantity, SUM(d.quantity*d.prize) as euros
FROM TransactionDetail d
LEFT JOIN d.transaction t
LEFT JOIN d.product p
LEFT JOIN t.shop s 
LEFT JOIN s.groups g
ON s.id MEMBER OF g.shops
WHERE p.category = :category
AND g.id = :group
AND t.date > :from
AND t.date < :to
GROUP BY p

问题:s.groups是一个集合,g.shops也是如此。我不知道这个查询必须在世界上如何完成。

1 个答案:

答案 0 :(得分:0)

这是手写的,没有保险可行。您会注意到DQL 关于表格,但对象

所以JOINS实际上是在对象属性而不是列上完成的。 (这就是为什么它取决于你的实体类。

此外,如果您未首先获取根实体,则无法获取数据(在这种情况下为detail)。

此外,像quantity * prize这样的表达式可能无效。

仅使用DQL查询:

$query = $entityManager->createQuery('
    SELECT detail, product, 
    SUM(detail.quantity) as quantity, SUM(detail.quantity*detail.prize) as euros
    FROM TransactionDetail detail
    LEFT JOIN detail.transaction transaction
    LEFT JOIN detail.product product
    LEFT JOIN transaction.group product ON group.shop = transaction.shop
    WHERE product.category = :category
    AND group.id = :group
    GROUP BY product
');

$results = $query->execute();

在某些情况下,使用本机sql更好:http://docs.doctrine-project.org/en/latest/reference/native-sql.html#resultsetmappingbuilder

甚至是唯一的选择。 PS:我说谎了,你可以创建自己的DQL函数来制作一些特定的东西:http://docs.doctrine-project.org/en/latest/cookbook/dql-user-defined-functions.html