gpt4 book ai didi

symfony - DQL - leftJoin() 错误 : Expected Literal, 得到 'JOIN'

转载 作者:行者123 更新时间:2023-12-02 02:05:14 25 4
gpt4 key购买 nike

这段代码:

$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() 方法错了吗?

最佳答案

Doctrine ORM 需要您判断连接的是哪个关系,而不是实体本身(您使用 p.convention 做得很好):

$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 子句)。我还在可选参数中转移了一些关于联接的 WHERE 子句(DQL 中的WITH)。

edit2:提案和投票之间没有关系,不确定是否有效。

edit3:最佳实践是对 WHERE 子句中的所有值使用 setParameter。

关于symfony - DQL - leftJoin() 错误 : Expected Literal, 得到 'JOIN',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22658193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com