【发布时间】: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();
【问题讨论】: