Добавить условие в пункт where-in-Doctrine QueryBuilder - PullRequest
0 голосов
/ 01 октября 2019

Я использую 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
)

То, что мне нужно добавить в подзапрос, - это еще одно условие для предложения where, поэтому оно станет:

...
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());    
    }    
}   
...