2014-03-26 61 views
5

此代碼:DQL - leftJoin()錯誤:預期文字,得到了 '加入'

$builder->select('p') 
    ->from('ProProposalBundle:Proposal', 'p') 
    ->leftJoin('ProProposalBundle:Proposal:Vote', 'v') 
    ->leftJoin('ProUserBundle:User', 'u') 
    ->andWhere('v.proposal = p') 
    ->andWhere('v.user = u') 
    ->andWhere('v.decision = "in_favor" OR v.decision = "against"') 
    ->andWhere('u = :user') 
    ->setParameter('user', $options['user']) 
    ->andWhere('p.community = :community') 
    ->setParameter('community', $community) 
    ->andWhere('p.archived = :archived') 
    ->setParameter('archived', $options['archived']) 
    ->leftJoin('p.convocation', 'c') 
    ->andWhere("p.convocation IS NULL OR c.status = '" . Convocation::STATUS_PENDING . "'"); 

    return $builder->getQuery()->execute(); 

返回錯誤:

[Syntax Error] line 0, col 106: Error: Expected Literal, got 'JOIN' 

這是所形成的查詢:

SELECT p FROM ProProposalBundle:Proposal p LEFT JOIN ProProposalBundle:Proposal:Vote v LEFT JOIN ProUserBundle:User u LEFT JOIN p.convocation c WHERE v.proposal = p AND v.user = u AND (v.decision = "in_favor" OR v.decision = "against") AND u = :user AND p.community = :community AND (p.convocation IS NULL OR c.status = 'pending') ORDER BY p.created desc 

LEFT JOIN缺少ONWITH的情況。問題是:我在做什麼錯誤的DQL查詢?我用leftJoin()方法錯了嗎?

回答

13

學說ORM需要你告訴它關係被加入,而不是實體本身(你做得很好用p.convocation):

$builder->select('p') 
    ->from('ProProposalBundle:Proposal', 'p') 
    ->leftJoin('ProProposalBundle:Proposal\Vote', 'v', 'WITH', 'v.proposal = p AND v.user = :user AND (v.decision = :in_favor OR v.decision = :against)') 
    ->setParameter('user', $options['user']) 
    ->setParameter('in_favor', 'in_favor') 
    ->setParameter('against', 'against') 
    ->andWhere('p.community = :community') 
    ->setParameter('community', $community) 
    ->andWhere('p.archived = :archived') 
    ->setParameter('archived', $options['archived']) 
    ->leftJoin('p.convocation', 'c') 
    ->andWhere("p.convocation IS NULL OR c.status = :pending") 
    ->setParameter('pending', Convocation::STATUS_PENDING); 

return $builder->getQuery()->execute(); 

編輯:我倒投票的關係,你的評論和刪除無用的WHERE子句(Doctrine自動解決了JOIN ON子句,我還在可選參數(WITH在DQL中)中傳遞了一些關於連接的WHERE子句

edit2:沒有建議和表決之間的關係,不確定它是否有效。

edit3:最佳做法是對所有WHERE子句中的值使用setParameter。

+0

哦!好。事情是'p.vote'不存在(只有'v.proposal')。也沒有'p.user'(只有'v.user')。 – Manolo

+0

你應該像p.votes反轉關係,你可以使用v.user(我編輯我的答案) – AlterPHP

+0

任何方式來實現它,而不增加像'p.votes'這樣的關係?這一定是可能的。 – Manolo

相關問題