我正在使用API平台,需要在某些条件下进行选择。我正在使用扩展来做到这一点,传递给Doctrine \ ORM \ QueryBuilder。
通常情况下可以正常工作,但是在这种情况下,我很难在WHERE id IN(sub-query)
子句中修改子查询。
这是作为字符串接收的查询(请注意,它是作为QueryBuilder对象而不是字符串传递的):
SELECT o
FROM App\\Entity\\Employee o
WHERE o.organization IN(
SELECT id_a1
FROM App\\Entity\\Organization id_a1
WHERE id_a1.id = :id_p1
)
我需要添加到子查询中的是子句的另一个条件,所以它将变为:
...
IN(
SELECT id_a1
FROM App\\Entity\\Organization id_a1
WHERE id_a1.id = :id_p1 AND id_a1.owner = :owner
)
我需要帮助来解决如何仅接收子查询并修改此对象。我认为这是一个QueryBuilder或其他存在于原始QueryBuilder对象中的对象。
修改: 这是我的骇客,但可以轻易破解。
$query = $this->getQueryBuilder();
$where = $query->getDQLPart('where');
$query->resetDQLPart("where");
$squery = $this->getQueryBuilder()
->getEntityManager()
->createQueryBuilder();
$param = $query->getParameters()[0];
$squery->select("org")
->from(\App\Entity\Organization::class, "org")
->where("org.owner = :owner")
->andWhere(sprintf("org.id = :%s", $param->getName()));
$field = sprintf("%s.organization", $query->getRootAlias());
foreach($where->getParts() as $key => $value) {
if (strpos($value->getName(), $field) !== false) {
$query->where(
$query->expr()->in(
$field,
$squery->getDQL()
)
);
$query->setParameter(":owner", $this->security->getUser());
}
}