Symfony 带连接数组的条令querybuilder

Symfony 带连接数组的条令querybuilder,symfony,orm,doctrine,entities,hydration,Symfony,Orm,Doctrine,Entities,Hydration,我注意到一种行为,我最近在symfony 3.3下没有真正遇到过 如果我将querybuilder与一些联接一起使用,那么在我得到的结果集中,我最终会得到结果数组中新行上的每个表- 例如,如果我将t1和t2连接到t3,其中每一个都是一个条令实体,我将得到一个看起来有点像这样的结果: $results[0] => (row1 entity for t3) $results[1] => (row1 entity for t1) $results[2] => (row1 entity

我注意到一种行为,我最近在symfony 3.3下没有真正遇到过

如果我将querybuilder与一些联接一起使用,那么在我得到的结果集中,我最终会得到结果数组中新行上的每个表- 例如,如果我将t1和t2连接到t3,其中每一个都是一个条令实体,我将得到一个看起来有点像这样的结果:

$results[0] => (row1 entity for t3)
$results[1] => (row1 entity for t1)
$results[2] => (row1 entity for t2)

$results[3] => (row2 entity for t3)
$results[4] => (row2 entity for t1)
$results[5] => (row2 entity for t2)
这3个数组项对应于组成结果集单个联接“行”的每个实体/表

我发现水合物标量给了我一个更传统的“标量”duh。。如果结果数组的每个元素都包含一个完整的标量行,则不会产生任何结果。。但是我没有很好的水合实体对象来处理:

我想知道,在不编写自己的helper方法的情况下,有没有办法在本地使用symfony/doctor,这样我就可以得到一个结果数组,其中每个元素对应于结果集中的一行?是否可以使用上述每个实体对象的键

或者,除此之外,人们通常如何处理这个问题? 在上面的示例中,迭代这样一个结果集并将每组3个数组元素作为一个“行”处理是否“安全”?也就是说,把数组分成3块,或者一次迭代3块

这种行为真的让我吃惊,而且似乎很不直观。任何关于这背后思想的教育都可能会有所帮助

另外,当我使用HYDRATE_数组时,这似乎不会在我定义的任何OneToOne、OneToMany或ManyToOne关系中对相关实体进行HYDRATE。我希望一个多维数组包含我的相关实体属性。。一厢情愿的想法,或者不需要额外的辅助方法就能再次实现

谢谢大家


*编辑-在我的示例中出错

没有看到您的实际查询,我不能肯定,但我怀疑您正在使用fetch连接

e、 g.从用户u中选择u,a加入u地址a

以下是本手册的相关部分,解释了这一点:

当使用fetch join查询时,它将返回结果数组根级别上FROM子句中的类


将其与此查询进行比较:从用户u加入u地址a中选择u。通过此查询,将返回一个用户实例数组,并将每个用户的地址提取到Useraddress变量中。

刚刚阅读了这些文档,如果我将select的内容更改为联接中的一个实体,这应该可以解决问题吗?现在对我来说这很有意义——我在初始选择中要求多个表,这些表作为单个对象而不是嵌套的方式被分解到结果数组的根级别。明白了,但仍然需要尝试,直到遇到一些问题。。今天又碰到了。我使用的是querybuilder,因此我的语法与下面类似$结果=$qb->从'AppBundle\Entity\EntityA','a'->innerJoin'AppBundle\Entity\EntityB','b','WITH','a.field1=b.field2'中选择'a','b'->这是按照您上面描述的获取连接方式处理的-我如何更改它以强制进行常规连接,因此我为每个实体获得一行,将连接的实体作为该行的子实体?您应该能够从select中去掉“b”,这将避免fetch连接。此外,您可能不需要“WITH”,“a.field1=b.field2”,因为条令应该已经知道如何基于映射加入它。