Doctrine中的getScalarResult和getArrayResult有什么区别

What's the difference between getScalarResult and getArrayResult in Doctrine

getScalarResult() 和 getArrayResult() 的使用有什么区别 当 运行 在 Doctrine 中使用 QueryBuilder 进行查询时:

$query = $this->em->createQueryBuilder();
        $query->select(self::SHORT_LIST)
            ->from(DataSetting::class, 'ds')
            ->andWhere('ds.'.$field.' LIKE :searchField')
            ->setParameter('searchField', $value . '%')
            ->setMaxResults($filters->getLength());
$query->getQuery()->getScalarResult()

$query->getQuery()->getArrayResult()

由于这在 Doctrine 上没有很好的记录,我想了解概念上的差异。

从表面上看,getArrayResult()getScalarResult() 都会 return 在您的查询中得到相似或相同的结果。基本上它们所改变的只是结果将如何水合:

  • ArrayHydrator -- 生成嵌套数组“图形”,通常(并非总是)可与相应的对象图形互换以进行只读访问。
  • ScalarHydrator -- Hydrator 生成标量数据的平面矩形结果。

他们对应的测试文件显示了他们产生什么样的输出,但可能还是有点不清楚。

简单来说,ScalarHydrator 将 return 仅包含标量值的字段值映射列表。 ArrayHydrator 可以 return 多个数组,关联数组列表(键值映射,类似于 ScalarHydrator),但它也可以包含对象,列表可以以某种方式索引并可以嵌套。

在某些情况下,尤其是对于简单的查询,两个水化器可能 return 得到相同的结果。在那种情况下,ScalarHydrator 的开销可能会更少,但它是否真的会影响性能我无法确定。