Отношения, связанные с DQL, не заполняются

#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
     ";