我正在尝试在单个数组结果中选择多个对象,但我无法看到如何选择它...
其实我有这个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": { ...}
},
我想把它封装在一个包含两个对象的新对象中,如:
{
"Object1" : { ... },
"Object2" : { ... }
},
{
"Object1" : { ... },
"Object2" : { ... }
},
我想我需要选择这个select(查询)来将这两个对象分组到一个新对象中,但我无法弄清楚如何制作它。
我也知道,如果我只是为了($ i = 0; i< sizeof($ result); i + = 2)我可以在新的这两个obj中连接,但我不认为这是一个很好的解决方案。
有人可以在这里给我一个亮点吗?
答案 0 :(得分:0)
如果这两个对象是相关的,那么良好实践将是定义这种关联映射,即实体关系中的一对多或多对一。例如
在国家实体/对象中 - (当然也在州一侧定义)
/**
* @ORM\OneToMany(targetEntity="State", mappedBy="stateCountry")
*/
private $states;
你可以简单地做一个
$country->getStates()
有关详情,请参阅Doctrine Association mapping
但是如果它们不是,并且您想要混合结果,则需要使用结果集映射/标量结果。我通常使用本机查询来做这样的事情。例如
$rsm = new ResultSetMapping();
$rsm->addScalarResult('name', 'name');
$rsm->addScalarResult('id', 'id');
$rsm->addScalarResult('slug', 'slug');
$rsm->addScalarResult('num', 'num');
$sql = "SELECT f.name, f.id, f.slug, COUNT( t.demo_id ) AS num FROM tag_demos t LEFT JOIN tag f ON f.id = t.tag_id " .
" GROUP BY t.tag_id ORDER BY COUNT( t.demo_id ) DESC LIMIT 20";
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
return $query->getResult();
有关更多示例,请参阅Native Query-Result Set Mapping。