为什么使用查询构建器与 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
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