如何在 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));
我正在尝试使用 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));