0

我的模型中有这种情况:

产品属于一个类别。TransactionDetail 有产品、价格和数量。交易有 TransactionDetails 和 date。商店有交易。集团有商店。

它们是教义实体,它们是适当相关的。(我不粘贴课程,它会太长)。

事情是我需要查询模型以获得销售的总产品(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 查询中(因为不建议使用纯 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 也是。我不知道这个查询必须如何完成。

4

1 回答 1

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

于 2013-06-27T09:53:09.480 回答