我的模型中有这种情况:
产品属于类别。 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也是如此。我不知道这个查询必须在世界上如何完成。
答案 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