为什么使用查询构建器与 createQuery 时我的结果数组与水合关联实体的形状不同?

Why is my result array with a hydrated associated entity shaped differently using query builder vs createQuery?

Doctrine 的 documentation 描述了两种 select 记录及其关系的方法,一种使用“获取连接”,另一种不使用:

获取加入

获取地址的连接:

<?php
$query = $em->createQuery("SELECT u, a FROM User u JOIN u.address a WHERE a.city = 'Berlin'");
$users = $query->getResult();

当 Doctrine 将查询与 fetch-join 混合在一起时,returns 结果数组根级别的 FROM 子句中的 class。在前面的示例中,返回了一个 User 实例数组,每个用户的地址都被提取并保存到 User#address 变量中。如果访问地址 Doctrine 不需要延迟加载与另一个查询的关联。

反之

检索 ForumUser 及其单个关联实体:

<?php
$query = $em->createQuery('SELECT u, a FROM ForumUser u JOIN u.avatar a');
$users = $query->getResult(); // array of ForumUser objects with the avatar association loaded
echo get_class($users[0]->getAvatar());

我的问题

当我使用 查询生成器 时,它的执行方式类似于获取连接,并且我收到一个包含所有用户及其根中的关联的数组。喜欢:

$qb = $this->em->createQueryBuilder()
    ->select('u')
    ->from(User::class, 'u');

$qb->join(Address::class, 'a', Join::WITH, 'u.a = a');

$qb->addSelect('a');

// Returns
$result = [
    'user' => // User
    'address' => // Address
];

正如预期的那样,User 对象也有 Address hydrated。

但是我不想要这个,我希望它的形状像第二个例子:一个只有用户的数组,地址只能通过用户对象访问。我 可以 简单地过滤数组以获得所需的形状,但由于我缺乏理解,我觉得这是一种解决方法。

是否可以使用查询构建器来获得类似于上面第二个示例的结果数组?还是我 来过滤结果数组?令我困惑的是,两者生成的实际 SQL 是相同的!

我来自Laravel,Doctrine 对我来说是全新的,所以请原谅我在这个问题上的天真。如果我需要澄清任何事情,请告诉我。

谢谢!

我想我在相关问题部分找到了答案:Symfony2 query builder joins to get objects as a single array

您应该加入协会,而不是加入实体的完全限定名称。所以查询变为:

SELECT hs,s,h
  FROM  \App\SoBundle\Entity\HandsetSubscription hs                    
  JOIN  hs.subscription s with s.id = hs.subscription 
                    AND s.mins  = 150 
                    AND s.mb    = 250 
                    AND s.sms   = 150
  JOIN  hs.handset h with h.id = hs.handset