【发布时间】:2016-10-20 17:40:38
【问题描述】:
我正在尝试在单个数组结果中选择多个对象,但我看不到如何选择它...
其实我有这个 DQL:
$dql = ' SELECT obj AS Object1, objExternalRef AS Object2 FROM MyEntity1 AS obj
INNER JOIN obj.objChild AS objChild
INNER JOIN MyEntity2 AS objExternalRef WITH objExternalRef.objChild= objChild
WHERE something
';
$result = $em->createQuery($dql)
->setParameter( ... )
->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, 1)
->getResult();
返回这个数组[Object1,Object2,Object1,Object2,...]:
{
"Object1": {...}
},
{
"Object2": { ...}
},
我想将它封装在一个包含以下 2 个对象的新对象中:
{
"Object1" : { ... },
"Object2" : { ... }
},
{
"Object1" : { ... },
"Object2" : { ... }
},
我想我需要选择这个 select(query) 来将这些 2 对象分组到一个新对象中,但我不知道如何制作它。
我也知道,如果我只是创建一个 for($i = 0; i
有人可以在这里给我一盏灯吗?
【问题讨论】:
-
您可以使用DTO 有一个帮助车辆。
-
DTO 非常好,但在文档中,它说“请注意,您只能将标量表达式传递给构造函数。”。我的案例我需要完整的对象和子对象,如果我尝试强制 DTO 构造函数接受我的实体,则会抛出错误 传递给 testDTO::__construct() 的参数 1 必须是 LojaProdutos 的实例,给定整数所以据我所见,我的 DTO kkk 中会有一个很大的构造函数,我是对的还是有其他方式?
-
似乎是这样,但这取决于您将使用此 DTO 的目的。如果偶然地,您并不总是需要所有这些水合,您可以只选择给定实体的 pk。然后懒洋洋地给它们补水。
-
很好!,所以我可以将 pk 传递给 DTO,然后在构造函数上调用 em->getReference("Entity", pk) 并对其进行水合。我的最后一个问题是:这不会对数据库造成严重过载(进行两次搜索,第一次是获取结果,第二次是为每个结果补充水分)还是会从缓存中补充水分?
-
我不确定这是否可行。目前,您无法将实体管理器传递给每个构造函数。因此,毕竟您可能会以您想要避免的相同事情结束(将对象包装在某个循环中)。仅当您实际上不需要为每个 DTO 补水时,它才真正有用。而且您仍然需要一个可以访问实体管理器的额外 hydrator。
标签: php symfony doctrine-orm