新对象

时间:2016-10-20 17:40:39

标签: php symfony doctrine-orm

我正在尝试在单个数组结果中选择多个对象,但我无法看到如何选择它...

其实我有这个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中连接,但我不认为这是一个很好的解决方案。

有人可以在这里给我一个亮点吗?

1 个答案:

答案 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