Запрос загружает и обрабатывает основной объект с его объединенными объектами, которые фильтруются.
Тот же запрос с другой фильтрацией не обновляет объединенные объекты.
Некоторые данные:
Tiers:
| id | name |
| 1 | alpha |
| 2 | beta |
Container:
| id | tiers_id | category |
| 10 | 1 | A |
| 20 | 1 | A |
| 30 | 1 | B |
| 40 | 1 | B |
Выполните 2 запроса, чтобы получить несколько уровней со своими объединенными контейнерами, сначала категорию A, затем категорию B:
$dql = "select t, c
from Tiers t
join t.containers c
where t.id in (?1) and c.category = (?2)";
$result = $em->createQuery($dql)
->setParameter(1, array(1))
->setParameter(2, 'A')
->getResult();
$tiers = $result[0];
$containers = $tiers->getContainers(); // tiers 1 with containers 10 and 20, that's fine !
$result = $em->createQuery($dql)
->setParameter(1, array(1))
->setParameter(2, 'B')
->getResult();
$tiers = $result[0];
$containers = $tiers->getContainers(); // BAD HERE: still get containers 10 and 20, looking for containers 30 and 40.
После второго запроса уровни 1 сохраняют свои контейнеры, загруженные во время первого запроса..Это не то, что ожидается.
Так есть ли способ получить контейнеры 30 и 40 после второго запроса?
Может быть, это своего рода "сброс / отсоединение" контейнеров сущностей уровней после первого запроса?
Или что-нибудь еще ...
Многократный выбор в запросах используется для объединения уровней с необходимыми контейнерами.
Метод getContainers выдает ожидаемые контейнеры от каждого уровня.
И стоимостьBDD - это всего лишь один SQL-запрос, независимо от количества разыскиваемых уровней.
Я полагаю, что уровни не могут быть отсоединены / перезагружены, поскольку они обновляются до, между запросами и после них, при возникновении такого исключенияпромывка:
Uncaught Exception: Multiple non-persisted new entities were found through the given association graph
* A new entity was found through the relationship 'XXX' that was not configured to cascade persist operations for entity: XXX\Entity\Tiers@00000000257b87500000000018499b62.