Doctrine возвращает прокси-объект при объединении таблицы с обнуляемыми отношениями

Я пытаюсь получить объекты из одного класса, соединенного с другим классом.
Не все сущности фактически присоединились к сущностям.

Это вроде как следующее утверждение:

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 (Магазин).

Магазин Entity (A) является прокси

Кто-нибудь знает почему и как я могу решить эту проблему?

Примечание: я знаю, что я мог бы просто использовать имя класса вместо сущности при использовании отражений, но я также хотел бы понять проблему здесь, поскольку она может повлиять на время выполнения …

Редактировать: Прикрепленный скриншот

5

Решение

Если проблема заключается в том, что поля не загружены, то перед использованием отражения проверьте, загрузил ли Doctrine объект, и загрузите его иначе:

if (
$object instanceof \Doctrine\Common\Persistence\Proxy
&& !$object->__isInitialized()
) {
$object->__load();
}
// ... your code

Но, как я вижу из вашего скриншота, вы неправильно определили проблему. Если вы выберете a сначала (как в вашем примере), тогда в списке результатов не будет прокси.

Как я полагаю, в вашем примере все сущности магазина находятся в некоторой ассоциации (не выбираются с помощью запроса, но, например, $country->getShops();) а также Shop [70] не является прокси только потому, что где-то до этого момента Доктрина уже загрузила его. Если сущность находится в карте (по идентификатору) — она ​​используется вместо прокси, так как она уже загружена.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector