Доктрина: выберите запрос, чтобы обновить объединение гидратированных объектов? - PullRequest
0 голосов
/ 20 ноября 2018

Запрос загружает и обрабатывает основной объект с его объединенными объектами, которые фильтруются.
Тот же запрос с другой фильтрацией не обновляет объединенные объекты.

Некоторые данные:

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.

1 Ответ

0 голосов
/ 21 ноября 2018

Сбросить контейнеры уровней перед вторым запросом:

foreach($result as $tiers)
    $tiers->nullContainers();

Добавить метод в Entity \ Tiers:

public function nullContainers()
{
     this->containers = null;
}

Затем второй запрос «обновить» контейнеры уровней.

...