数组不在数组中用于教义查询

时间:2018-05-12 22:30:22

标签: php symfony doctrine-orm doctrine symfony-2.8

我需要使用类似数组的条件不在数组中。我有一个数组,其中一个有两个元素用于搜索。例如

(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。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这可能不是最终答案,但这里有一些事情需要纠正。

  1. 虽然它在基本SQL中是可以容忍的,但查询应该在双引号之间,而字符串应该在简单的引号之间。不是相反。

  2. 从您的代码中,我猜测您的自定义查询位于控制器中。最好将它移动到实体存储库中,使用新功能,然后在控制器中调用此函数 奇怪的是你没有得到createQueryBuilder()的错误,因为在这种情况下它不存在。

  3. 避免使用可能被误认为实体名称的别名。

  4. 我认为where()您的查询错误。

  5. 考虑到你应用了第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

    这是我根据你的代码做的事情。 告诉我们它是否解决了您的问题。