Doctrine将实体发送给DQL的NEW构造函数

时间:2015-03-12 08:08:48

标签: php symfony doctrine-orm doctrine dto

我在Symfony2中有一个带有Doctrine的Blog应用程序,由三个实体组成

  • 注释
  • 用户

  • 一个帖子可以有很多评论

  • 一个用户可以有很多评论

此应用程序有一个json API调用“/ me / comments”

我希望它返回

[
    {
       'text': 'great post',
       ... 10 other field a comment can have ...
       'post': { 'id': 3}
    },
    {
       'text': 'i dont like it',
       ... 10 other field a comment can have ...
       'post': {'id': 4}
    },

]

普通的教义函数返回json中的所有关系(User,Post),我不希望Post可以包含大文本,所以我只对Id感兴趣

我尝试了很多解决方案而且我找到了一个

http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#new-operator-syntax

所以现在我的DQL查询看起来像那样

SELECT NEW CommentDTO(c) FROM Comment as c WHERE c.author = :user

CommentDTO的构造函数看起来像那样

__construct(Comment c) {
   $this->text = c.getText();
   $this->post = [ 'id' => c.getPost().getId() ];
}

当我执行它时,我得到了

{
   "code":500,
   "message":"Argument 1 passed to MVMS\\ApiBundle\\Entity\\CommentDTO::__construct() must be an instance of MVMS\\ApiBundle\\En
tity\\Comment, integer given"

}

当然我可以逐个给出参数,但是Comment有十几个字段并且逐个发送它们似乎非常hackish。

有没有办法直接发送对象?

1 个答案:

答案 0 :(得分:1)

正如@Cerad在评论中提到的那样,目前还没有办法实现这一目标,documentation表示,2017年仍然具有相关性:

  

请注意,您只能将标量表达式传递给构造函数。

我在issue tracker找不到相关的功能请求,因此很可能在可预见的将来无法实现。