#symfony #doctrine #dql #doctrine-query
Вопрос:
У меня есть 2 сущности: User
и Metadata
. Они имеют двунаправленную связь «один ко многим» (у пользователя может быть много записей метаданных).
В декораторе контекста, который я использую для исключения флагов, я запрашиваю пользователя и некоторые отношения пользователя, которые могут потребоваться с помощью DQL:
$dql = "
SELECT user
FROM
meQEntityUser user
JOIN user.profile profile
JOIN profile.client client
JOIN user.metadata metadata
WHERE user.uid = :user_id
";
$this->user = $em->createQuery($dql)
->setParameter('user_id', $session_user->getId())
->useQueryCache(true)
->getOneOrNullResult();
// for debug
dump($this->user);
exit();
Этот запрос возвращает пользователя user->profile
с правильно заполненными полями user->profile->client
и. Однако в нем не заполнено поле метаданных.
У пользователя, о котором идет речь, есть 18 записей метаданных, но выполнение dump($this->user)
показывает мне пустую коллекцию массивов:
Вот мое учение, отображающее эти отношения:
AppBundleEntityUser:
# ...
oneToMany:
metadata:
fetch: EXTRA_LAZY
targetEntity: AppBundleEntityUserMetadata
mappedBy: user
cascade: [all]
orphanRemoval: true
indexBy: name
и другая сторона отношений:
AppBundleEntityUserMetadata:
# ...
manyToOne:
user:
targetEntity: AppBundleEntityUser
inversedBy: metadata
joinColumn:
name: user_id
referencedColumnName: uid
Разве это не работает, потому что Пользователь не является владельцем?
Ответ №1:
Я должен был явно перечислить metadata
в своем ВЫБОРЕ:
$dql = "
- SELECT user
SELECT user, metadata
FROM
meQEntityUser user
JOIN user.profile profile
JOIN profile.client client
JOIN user.metadata metadata
WHERE user.uid = :user_id
";