Symfony 使用联接进行选择时是否限制根实体中的文件?

Symfony 使用联接进行选择时是否限制根实体中的文件?,symfony,join,doctrine-orm,Symfony,Join,Doctrine Orm,鉴于A与B有一对多的关系我想问“A中有几列,B中有几列” 然而,我不能哄骗信条,使之成为只有这些列的对象和只有这些列的对象 仅了解两个极性选项: 一个 $this->createQueryBuilder('a') ->select('a', 'b') ->join('a.b', 'b') 它将获取所有数据(这将导致不需要的数据序列化) 两个 $this->createQueryBuilder('b') ->select('a.id, a.fieldOne,

鉴于
A
B有一对多的关系
我想问“A中有几列,B中有几列”

然而,我不能哄骗信条,使之成为只有这些列的对象和只有这些列的对象

仅了解两个极性选项:

一个

$this->createQueryBuilder('a')
 ->select('a', 'b')
 ->join('a.b', 'b')
它将获取所有数据(这将导致不需要的数据序列化)

两个

$this->createQueryBuilder('b')
  ->select('a.id, a.fieldOne, a.fieldTwo, b.fieldThere')
  ->join('a.b', 'b')
在这种情况下,我将得到
'id',fieldOne',fieldTwo',fieldThere'
的数组。这打破了其他存储库方法的惯例,这些方法将返回水合对象和嵌套对象

那里(thx@Artamiel)

我可以使用这样的部分对象:

$this->createQueryBuilder('b')
  ->select('partial a.{id, fieldOne, fieldTwo}, partial b.{id, fieldThere}')
  ->join('a.b', 'b')
注意:字段列表中需要部分ID,因此添加到
b

但是,这不会像FOSRestBundle+JMS/Serializer所宣传的那样起作用,它将遍历不存在的字段,更重要的是,select中未指定的关系将被加载。

您可以使用

$this->createQueryBuilder('b')
->select('PARTIAL a.{id, fieldOne, fieldTwo}, PARTIAL b.{fieldThere}')
->join('a.b', 'b')
但是请注意,这将创建具有所有属性的对象-唯一的区别是您不会将未提及的属性水合到结果中

这意味着,没有人确切地知道在以后使用对象时,某个属性是真的为null还是仅仅为null,因为您没有使用它

只有当您确定自己在做什么,并且对于预成熟优化具有高风险时,才应该使用此语法

你也可以

 $query->setHint(Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, 1);
避免使用不属于部分对象的“null”属性

但这同样意味着,您有一个“相同”的对象,具有两组不同的属性,这也可能导致麻烦


请参阅此条目:

您可以查看关于的章节。请参阅我的更新答案(很抱歉单击“接受”按钮,我认为我的序列化层中存在错误,因为最终结果确实包含了
部分
中字段之外的一些附加值,但是如果我
序列化
getResult()
它不显示这些值,因此您的答案是正确的)