【问题标题】:How to make an Where In subquery in symfony如何在 symfony 中创建 Where In 子查询
【发布时间】:2020-01-09 18:39:06
【问题描述】:

我正在尝试使用 Doctrine QueryBuilder 执行此 SQL 查询:

SELECT * FROM events WHERE NOT id in (SELECT event_id FROM ues WHERE user_id = $userID)

UserEventStatus 具有来自 User 和 event 的外键,以及用于状态的整数。 我现在想从特定用户查询所有在 UserEventStatus 中没有条目的事件。 我在 EventRepository 中的函数如下所示:

    public function getUnReactedEvents(int $userID){
        $expr = $this->getEntityManager()->getExpressionBuilder();
        $originalQuery = $this->createQueryBuilder('e');
        $subquery= $this->createQueryBuilder('b');
        $originalQuery->where(
            $expr->not(
                $expr->in(
                    'e.id',
                    $subquery
                        ->select('ues.user')
                        ->from('App/Entity/UserEventStatus', "ues")
                        ->where(
                            $expr->eq('ues.user', $userID)
                    )
                )
            )
        );
        return $originalQuery->getQuery()->getResult();

    }

但我收到一条错误消息: Error: Method Doctrine\Common\Collections\ArrayCollection::__toString() must not throw an exception, caught ErrorException: Catchable Fatal Error: Object of class Doctrine\ORM\EntityManager could not be converted to string (500 Internal Server Error) 任何人都可以帮助我或指出我在文档中的正确点吗?因为我找不到描述我的问题的东西。 另一件事是,我不知道它是否可能,但它会很好。我可以以某种方式直接提出对象请求吗?我的意思不是字符串App/Entity/UserEventStatus,而是像 UserEventStatus::class 之类的东西。 提前感谢您的帮助。 :)

编辑:当然必须是$originalQuery->getQuery()->getResult()。 如果它与 $subquery 类似,我会收到 [Semantical Error] line I0, col 41 near 'App/Entity/UserEventStatus': Error: Class 'App' is not defined. (500 Internal Server Error)

第二次编辑:

        $expr = $this->getEntityManager()->getExpressionBuilder();
        $queryBuilder = $this->createQueryBuilder('e');

        $subquery= $this->createQueryBuilder('b')
            ->select('ues.user')
            ->from('UserEventStatus', "ues")
            ->add('where', $expr->eq('ues.user', $userID));

        $originalQueryExpression = $expr->not($expr->in('e.id', $subquery));

        $queryBuilder->add('where', $originalQueryExpression);

        return $queryBuilder->getQuery()->getResult();

第三次编辑:感谢@Dilek,我使它与 JOIN 一起工作。这是最终的查询:

        $queryBuilder = $this->createQueryBuilder('e')
            ->leftJoin('App\Entity\UserEventStatus', 'ues', 'WITH', 'ues.user=:userID')
            ->setParameter('userID', $userID)
            ->where($expr->orX($expr->not(
                $expr->eq('e.id','ues.event')
            ),
                $expr->not($expr->eq('ues.user', $userID)))
            );


        return $queryBuilder->getQuery()->getResult();

【问题讨论】:

    标签: php symfony doctrine dql


    【解决方案1】:

    在查询中构建 AND WHERE

    public function search($term)
    {
        return $this->createQueryBuilder('cat')
            ->andWhere('cat.name = :searchTerm')
            ->setParameter('searchTerm', $term)
            ->getQuery()
            ->execute();
    }
    

    简单的是:->where('cat.name = :searchTerm')

    更新:

    我认为你需要使用 where in

    $qb->add('where', $qb->expr()->in('ues.user', $userID));
    

    And WHERE Or WHERE

    【讨论】:

    • 将其更改为 andWhere 并没有太大帮助...我不能将表达式放入 where 吗?
    • 查看更新的答案 $qb 是 $originalQuery 并且有一个示例,其中包含简单的 where 子句。
    • 感谢您迄今为止的帮助。不幸的是,我仍然收到同样的错误......使用 toString 方法......
    • 我把它说得好像它现在在原始帖子的新编辑中一样,也许我确实监督了一些事情:)
    • @CKWDani 请停止更新您的问题,并尝试这样->where($qb->expr()->in('ues.user', $userID)) 设置参数如果需要->setParameter(); qb 是db instans
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2021-03-17
    • 2020-10-13
    • 2021-02-25
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多