我需要使用类似数组的条件不在数组中。我有一个数组,其中一个有两个元素用于搜索。例如
(3,1)NOT IN((2,3),(1,3),(1,32))
它在phpmyadmin中作为SQL查询工作。但不是作为学说查询。
$em = $this->getDoctrine()->getManager();
$qb = $em->getRepository('FangoUserBundle:User')
->createQueryBuilder('user')
->leftJoin('user.collabInvitationTarget', 'invite')
->where('(:currentUserId, user.id) NOT IN (:inviteArr)')
->setParameter('currentUserId', $this->getUser()->getId())
->setParameter('inviteArr', $invites, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);
在渲染模板期间抛出异常(" [语法错误]第0行,第304行:错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS,得到&#39在FangoCollabaignBundle中的;,'"):默认:第54行的index.html.twig。
有什么建议吗?
答案 0 :(得分:1)
这可能不是最终答案,但这里有一些事情需要纠正。
虽然它在基本SQL中是可以容忍的,但查询应该在双引号之间,而字符串应该在简单的引号之间。不是相反。
从您的代码中,我猜测您的自定义查询位于控制器中。最好将它移动到实体存储库中,使用新功能,然后在控制器中调用此函数
奇怪的是你没有得到createQueryBuilder()
的错误,因为在这种情况下它不存在。
避免使用可能被误认为实体名称的别名。
我认为where()
您的查询错误。
考虑到你应用了第2点,我就是这样做的。
public function getNameYourFunction($user, $invites) {
$em=$this->getEntityManager();
$qb=$em->createQueryBuilder()
$qb->select("u")
->from(User::class, "u")
->leftJoin("u.collabInvitationTarget", "i")
->where($qb->expr()->notin("u.id", "(:inviteArrA)"))
->andWhere($qb->expr()->notin(":currentUserId", "(:inviteArrB)"))
->setParameters(array(
'currentUserId'=>$user->getId(),
'inviteArrA'=>implode(',', $invites),
'inviteArrB'=>implode(',', $invites),
));
}
您会注意到我正在使用User::class
确保通过添加以下行将其导入存储库:
use FangoUserBundle\Entity\User;
(在您的情况下可能不同use
)
这是我根据你的代码做的事情。 告诉我们它是否解决了您的问题。