Как сделать подзапрос Where In в symfony - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь выполнить этот SQL запрос с помощью Doctrine QueryBuilder:

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, вместо этого я получаю [Semantical Error] line I0, col 41 near 'App/Entity/UserEventStatus': Error: Class 'App' is not defined. (500 Internal Server Error)

Второй EDIT:

        $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();

Третий EDIT: Благодаря @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();

1 Ответ

0 голосов
/ 09 января 2020

Построение и ГДЕ в запросе

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

просто: ->where('cat.name = :searchTerm')

ОБНОВЛЕНИЕ:

Я думаю, вам нужно использовать где в

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

И ГДЕ ИЛИ ГДЕ

...