Я пытаюсь получить объекты из одного класса, соединенного с другим классом.
Не все сущности фактически присоединились к сущностям.
Это вроде как следующее утверждение:
SELECT a, b FROM A a LEFT JOIN B b ON a.id = b.aid GROUP BY a.id;
или в коде:
$query_builder = $em->getRepository('repository_of_A')->createQueryBuilder('a');
$query_builder = $query_builder->leftJoin('a.b', b);
$query_builder = $query_builder->groupBy('a.id');
$query = $query_builder->select('a, b')->getQuery();
$entities = $query->getResult();
Теперь проблема в том, что всякий раз, когда для A нет сущности B, Doctrine возвращает прокси-объект для A.
Поскольку я работаю с отражениями, мне нужен реальный объект, а не прокси.
На прикрепленном скриншоте объект с индексом 26 не имеет соответствующей сущности B для A (Магазин).
Кто-нибудь знает почему и как я могу решить эту проблему?
Примечание: я знаю, что я мог бы просто использовать имя класса вместо сущности при использовании отражений, но я также хотел бы понять проблему здесь, поскольку она может повлиять на время выполнения …
Редактировать: Прикрепленный скриншот
Если проблема заключается в том, что поля не загружены, то перед использованием отражения проверьте, загрузил ли Doctrine объект, и загрузите его иначе:
if (
$object instanceof \Doctrine\Common\Persistence\Proxy
&& !$object->__isInitialized()
) {
$object->__load();
}
// ... your code
Но, как я вижу из вашего скриншота, вы неправильно определили проблему. Если вы выберете a
сначала (как в вашем примере), тогда в списке результатов не будет прокси.
Как я полагаю, в вашем примере все сущности магазина находятся в некоторой ассоциации (не выбираются с помощью запроса, но, например, $country->getShops();
) а также Shop [70]
не является прокси только потому, что где-то до этого момента Доктрина уже загрузила его. Если сущность находится в карте (по идентификатору) — она используется вместо прокси, так как она уже загружена.
Других решений пока нет …