Доктрина: выберите запрос для обновления соединения с гидратированной сущностью?

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

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

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 составляет всего 1 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.
stackoverflow.com/questions/48152609/… Это могло быть решением
Jannes Botis 15.12.2018 15:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
171
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Затем 2-й запрос «обновляет» контейнеры ярусов.

Другие вопросы по теме