Doctrine/Symfony 查询生成器在左连接上添加选择

Cap*_*ggz 5 php mysql symfony doctrine-orm

我有一个与作者表相关的帖子表。这两个表都与第三个表(喜欢)相关,该表指示哪些用户喜欢哪些帖子。我想选择作者和喜欢的帖子,但不知道如何在获取结果后访问连接的对象。我的查询生成器如下所示:

$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();
Run Code Online (Sandbox Code Playgroud)

在上面,作者将始终有效,如果请求用户(示例中的用户 10)尚未与帖子进行交互,则 Like 值可能为空。查询工作正常,但我无法访问别名 post_author 或 post_liked 的数据。结果数据如下所示:

[
  [0] => Doctrine PostEntity,
  [1] => Doctrine PostEntity,
  ...
]
Run Code Online (Sandbox Code Playgroud)

我想要看起来更像这样的东西:

[
  [0] => ['post' => Doctrine PostEntity, 
          'post_author' => Doctrine UserEntity, 
          'post_liked' => Doctrine LikeEntity],
  [1] => ['post' => Doctrine PostEntity, 
          'post_author' => Doctrine UserEntity, 
          'post_liked' => Doctrine LikeEntity],
  ...
]
Run Code Online (Sandbox Code Playgroud)

如果我只是尝试加载作者,那就没问题,因为我可以从加载的帖子中加载作者值(Doctrine 自动使用作者表中选定的连接数据来水合对象)。例如:

$post = $result[0];
$author = $post->getAuthor(); // Doctrine UserEntity
Run Code Online (Sandbox Code Playgroud)

如果我尝试为当前用户加载点赞,就会出现问题。例如:

$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 
Run Code Online (Sandbox Code Playgroud)

如何访问查询中指定的数据?

Cap*_*ggz 1

我最终使用$query->getArrayResults()它根据学说配置中的关联命名用集合填充数组。查询中的关键字AS仅充当查询本身的挂钩,而不是输出数组/实体水合。

有关示例的完整解决方案,请参阅我的回答此处。