2013-06-27 2 views
0

У меня есть эта ситуация в моей модели:DQL-комплексный запрос в приложении Symfony2

Товар относится к категории. TransactionDetail имеет Продукт, цену и количество. Сделка была ТранзакцияДетали и дата. Магазин имеет транзакций. Группа имеет магазины.

Они являются объектами доктрины, и они должным образом связаны. (Я не вставляю классы, он слишком длинный).

Вещь - мне нужно запросить модель для получения общей проданной продукции (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).

Помогите мне, ребята?

Заранее спасибо.

================================================================================================================================== ===============================
EDIT:

Состояние искусства запроса:

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

haha, power of dql. это помогает много для простых запросов, вам не нужно выбирать *. – Florian

+0

Lol. Наверное, ты не фанат. Но я уверен, что будет какой-то специалист, который просветит меня: P – gomman

+0

просто ответил вам ниже :) после моего тролля. – Florian

ответ

0

Это ручная работа, никакая страховка не работает. Вы заметите, что DQL составляет не около таблицы, но объекты.

Таким образом, на самом деле СОЕДИНЕНИЯ на объекте Свойства, а не столбцы. (Вот почему это зависит от ваших классов сущностей.

Кроме того, вы не можете получить данные, если вы не принести корневой объект первый (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 является быть tter: 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

+0

спасибо. просто одно ... «ON group.shop = transaction.shop» невозможно. group.shop не существует. group.shopS - это коллекция магазинов. Может ли «ON transaction.shop ЧЛЕН группы group.shops» работать? – gomman

+0

нет, единственными возможными ключевыми словами являются WITH и ON. – Florian

+0

смотрите здесь: http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins – Florian