这段代码:
$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();
Run Code Online (Sandbox Code Playgroud)
正在返回错误:
[Syntax Error] line 0, col 106: Error: Expected Literal, got 'JOIN'
Run Code Online (Sandbox Code Playgroud)
这是形成的查询:
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
Run Code Online (Sandbox Code Playgroud)
LEFT JOIN缺少ON或WITH条件.问题是:我在DQL查询中做错了什么?我错了leftJoin()方法吗?
Alt*_*PHP 14
Doctrine 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();
Run Code Online (Sandbox Code Playgroud)
编辑:我在评论时反转了投票关系并删除了无用的WHERE子句(Doctrine自动解析了JOIN ON子句.我还在可选参数中传递了一些关于连接的WHERE子句(在DQL中为WITH).
edit2:Proposal和Vote之间没有关系,不确定它是否有效.
edit3:最佳做法是对WHERE子句中的所有值使用setParameter.
| 归档时间: |
|
| 查看次数: |
8788 次 |
| 最近记录: |