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