0

私のモデルには次のような状況があります。

製品はカテゴリに属します。TransactionDetail には、製品、価格、および数量があります。Transaction には TransactionDetails と date があります。ショップにはトランザクションがあります。グループにはショップがあります。

それらは 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 クエリにどのように配置するかについての考えがありません (単純な 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 に答える