向Doctrine QueryBuilder的子句中添加条件

时间:2019-10-01 13:19:41

标签: doctrine-orm api-platform.com where-in

我正在使用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());    
    }    
}   

0 个答案:

没有答案