带连接的 Doctrine querybuilder - hydrate 数组

Doctrine querybuilder with joins - hydrate array

我注意到最近在 symfony 3.3 下我没有真正遇到过的行为。

如果我使用带有一些连接的查询构建器,在我返回的结果集中,我最终会在结果数组的新行上得到每个 table - 例如,如果我将 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 个数组项对应于每个实体/'tables',它们构成了结果集的单个连接 'row'。

我发现 HYDRATE_SCALAR 给了我一个更传统的 'scalar'(duh.. 没有震惊)结果,结果数组的每个元素都包含一个完整的标量行..但是然后我没有得到很好的水合实体对象来处理:(

我想知道,有没有什么方法可以在不编写自己的辅助方法的情况下直接使用 symfony / doctrine 来获得结果数组,其中每个元素对应于结果集中的一行?也许上面每个实体对象都有键?

或者,除此之外,人们通常如何使用它? 是不是'safe'迭代这样一个结果集,把上面例子中每组3个数组元素都当成一个'row'处理?即,将数组分成 3 个,或者一次迭代 3 个?

这种行为真的让我很吃惊,而且看起来很不直观。任何关于这背后的想法的教育也可能有所帮助。

此外,当我使用 HYDRATE_ARRAY 时,这似乎不会在我定义的任何 OneToOne、OneToMany 或 ManyToOne 关系中混合相关实体。我期望一个包含我的相关实体属性的多维数组..一厢情愿,或者这可以实现(再次没有额外的辅助方法)

谢谢大家!

*编辑 - 我的例子有误

没有看到你的实际查询,我不能肯定地说,但我怀疑你正在使用提取连接。

例如SELECT u, a FROM User u JOIN u.address a

docs 的相关部分解释了这一点:

When Doctrine hydrates a query with fetch-join it returns the class in the FROM clause on the root level of the result array.

将其与此查询进行比较:SELECT u FROM User u JOIN u.address a。通过此查询,将返回 User 个实例的数组,并提取每个用户的地址并将其添加到 User#address 变量中。