【问题标题】:doctrine select in new object在新对象中选择学说
【发布时间】: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


【解决方案1】:

如果这两个对象相关,好的做法是在实体关系中定义此关联映射,即一对多或多对一。例如

在国家实体/对象中——(当然也在国家方面定义)

 /**
 * @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

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 2013-02-09
    • 2016-02-29
    • 2021-07-14
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多