如何在 symfony 中创建 Where In 子查询

How to make an Where In subquery in symfony

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

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

UserEventStatus 有来自用户和事件的外键,以及一个状态整数。 我现在想查询所有没有来自特定用户的 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 而不是我 recive [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();

在查询中构建 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