【问题标题】:Doctrine/Symfony query builder add select on left joinDoctrine/Symfony 查询构建器在左连接上添加选择
【发布时间】:2017-02-04 21:49:00
【问题描述】:

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

$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)没有与帖子交互,则 like 值可能为 null。查询工作正常,但我无法访问别名 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 

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

【问题讨论】:

  • 你试过select('p', 'a', 'l') 吗?
  • 我相信您在使用实体时尝试做的事情是不可能的。但是,如果您愿意在这种情况下使用数组,则有可能。为此,只需使用->getArrayResult()
  • @EmanuelOster getArrayResult() 看起来更近了,但我仍然看不到 post_author 或 post_liked 键。有没有办法选择连接表作为别名?

标签: php mysql symfony doctrine-orm


【解决方案1】:

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

有关示例的完整解决方案,请参阅我的answer here

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多