оставайся в Учении 2 - PullRequest
       2

оставайся в Учении 2

3 голосов
/ 17 ноября 2011

У меня есть две простые сущности:

  My\Entity\Coupon:
    type: entity
    table: coupon
    id:
      id:
        type: integer
        generator:
          strategy: AUTO
    fields:
      name:
        type: string
        length: 255
            nullable: false
      value:
         type: integer
         default: 0

    My\Entity\CouponUsers:
      type: entity
      table: coupon_users
      id:
        id:
          type: integer
          length: 11
          nullable: false
          generator:
            strategy: AUTO
      fields:
            coupon_id:
          type: integer
          length: 11
          nullable: false
        user_id:
          type: integer

Теперь я хочу показать простую статистику по использованным купонам.
Запуск этого SQL в phpMyAdmin:

SELECT c.name, count( * ) AS mycount
FROM coupon c
LEFT JOIN coupon_users u ON c.id = u.coupon_id
GROUP BY c.id
ORDER BY mycount DESC

Работает нормально, как и ожидалось, возвращает:

name1    54
name2    120

Затем я пытаюсь сделать то же самое из Учения 2:

$queryBuilder = $this->_em->createQueryBuilder()
    ->select('c.name, COUNT(*) as co')
    ->from('My\Entity\Coupon', 'c')
    ->leftJoin('My\Entity\CouponUsers', 'u',
        \Doctrine\ORM\Query\Expr\Join::ON, 'c.id = u.coupon_id')
    ->where('u.coupon_id = c.id')
    ->groupBy('c.id');

$dql = $queryBuilder->getDQL();
var_dump($dql);

SELECT c.name,
   COUNT(*) as co 
FROM My\Entity\Coupon c
LEFT JOIN My\Entity\CouponUsers u
ON c.id = u.coupon_id
WHERE u.coupon_id = c.id
GROUP BY c.id

Пока все хорошо. Но когда я делаю:

$queryBuilder->getQuery()->getResult();

Я получаю сообщение об ошибке:

[Syntax Error] line 0, col 88: Error: Expected Doctrine\ORM\Query\Lexer::T_DOT, got 'u'

Что не так? Как я могу это исправить?

1 Ответ

6 голосов
/ 17 ноября 2011

Вот как руководство по доктрине предложит кодировать ваш запрос:

$querybuilder = $this->_em->createQueryBuilder()
   ->select(array('c.name', 'COUNT(c.id) as co')
   ->from('My\Entity\Coupon', 'c')
   ->leftJoin('c.users', 'u')
   ->groupBy('c.id');

Чтобы выполнить это объединение в QueryBuilder, вам понадобится двунаправленная связь, настроенная между двумя сущностями, которую вы, похоже, еще не настроили.

Я использую аннотации для своих сущностей, но я думаю, что YAML будет выглядеть примерно так:

My\Entity\Coupon:
    manyToOne:
        users:
          targetentity: CouponUsers
           inversed-by: coupon

My\Entity\CouponUsers:
    onetoMany:
       coupon:
          targetEntity: Coupon
             mapped-by: users

Если у пользователей может быть много купонов, то отношения будут двунаправленными ManyToMany вместо manytoOne / oneToMany. Подробности о том, как настроить это, можно найти здесь .

...