Я пытаюсь выполнить этот 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();