2011-11-16 63 views
3

我有兩個簡單的實體:leftJoin教義2

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' 

有什麼不對?我怎樣才能解決這個問題?

回答

6

這裏是教義手冊將如何建議編碼查詢:

$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 

如果用戶可以有很多優惠券,那麼關係是雙向多對多的而不是多對一/一對多。有關如何配置的詳細信息,請參見here

+0

謝謝。我怎樣才能通過'co'添加訂單?在'co DESC'附近添加' - > orderBy('co','DESC')'返回'[語義錯誤]行0,列91':錯誤:'counter'未定義。 ' - > orderBy('COUNT(c.id)')' – Sfisioza

+0

你輸入的內容 - > orderBy('co','DESC')是正確的,應該可以工作。檢查明顯的第一個:orderBy()需要在groupBy()之後出現,並且您在select()中使用的別名需要與orderBy()中使用的別名相匹配。從錯誤消息中,您可能已經使用了別名。如果它還沒有合作,我很高興看看你的代碼。 – cantera

+0

謝謝。這確實是我的代碼的問題。 – Sfisioza