У меня есть стол сообщений, связанных много к одному с таблицей авторов. Обе таблицы относятся к третьей таблице (нравится), которая указывает, какие пользователи понравились, какие сообщения. Я хотел бы выбрать авторов и нравится с сообщениями, но не знаю, как получить доступ к объединенным объектам после получения результатов. Мой построитель запросов выглядит следующим образом:
$result = $em->createQueryBuilder() ->select('p') ->from('Post', 'p') ->leftJoin('p.author', 'a') ->leftJoin('p.likes', 'l', 'WITH', 'l.post_id = p.id AND l.user_id = 10') ->where("p.foo = bar") ->addSelect('a AS post_author') ->addSelect('l AS post_liked') ->getQuery()->getResult();
В вышеприведенном случае автор всегда будет действительным, когда подобное значение может быть нулевым, если запрашивающий пользователь (пользователь 10 в примере) не взаимодействовал с сообщением. Запрос работает нормально, но я не могу получить доступ к данным для псевдонимов post_author или post_liked. Полученные данные выглядят следующим образом:
[ [0] => Doctrine PostEntity, [1] => Doctrine PostEntity, ... ]
Мне хотелось бы что-то похожее на это:
[ [0] => ['post' => Doctrine PostEntity, 'post_author' => Doctrine UserEntity, 'post_liked' => Doctrine LikeEntity], [1] => ['post' => Doctrine PostEntity, 'post_author' => Doctrine UserEntity, 'post_liked' => Doctrine LikeEntity], ... ]
Если бы я только пытался загрузить автора, было бы хорошо, потому что я мог загрузить значение автора из загруженного сообщения (Doctrine автоматически увлажняет объект с выбранными данными соединения из таблицы автора). Например:
$post = $result[0]; $author = $post->getAuthor(); // Doctrine UserEntity
Проблема возникает, если я пытаюсь загрузить как для текущего пользователя. Например:
$post = $result[0]; $like = $post->getLike(); // INVALID - there's no property "like" on Post $likes = $post->getLikes(); // valid, but loads the whole collection $like = $post->post_liked; // INVALID - the SQL alias is not a valid object property
Как получить доступ к данным, указанным в запросе?
Я закончил использование $query->getArrayResults()
который заполняет массив коллекциями, основанными на имени ассоциации в конфигурации доктрины. Ключевое слово AS
в запросе служит только как крючок для самого запроса, а не для гидратации выходного массива / объекта.
Для полного решения с примерами см. Мой ответ здесь .