Doctrine ORM HYDRATE_SCALAR vs HYDRATE_ARRAY



我正在尝试使用以下查询从表格通过学说orm获取列的所有值:

SELECT item.templateId FROM MyBundle:Item item WHERE item.id IN (:ids)

我知道学说具有返回单个标量值的水合模式Query::HYDRATE_SINGLE_SCALAR。但是,当结果有多个记录时,它会抛出NonUniqueResultException,这很好。

自然,我猜Query::HYDRATE_SCALAR会做到这一点。但是,它返回与使用Query::HYDRATE_ARRAY时的结果完全相同。

代码:

$ids   = [1, 2, 3];
$query = $this->entityManager->createQuery('
          SELECT item.templateId FROM MyBundle:Item item WHERE item.id IN (:ids)
    ')
    ->setParameter('ids', $ids)
;
// Regardles whether I use HYDRATE_SCALAR or HYDRATE_ARRAY
// $result is the same
$result = $query->getResult(Query::HYDRATE_SCALAR);

这是两种情况下$result的外观:

Array
(
    [0] => Array
        (
            [templateId] => 52
        )
    [1] => Array
        (
            [templateId] => 90
        )
    [2] => Array
        (
            [templateId] => 89
        )
)

我希望它看起来:

Array
(
    [0] => 52
    [1] => 90
    [2] => 89
)

我知道我可以将其转换为我想要的形式,但是我想知道为什么HYDRATE_SCALAR不会像我期望的那样行事。

我认为它是这样的,因为,正如文档所说:

[it]可以包含重复数据。

那是array_column(PHP 5.5)发挥作用的时候。

尝试以下:

$result = $query->getResult(Query::HYDRATE_SCALAR);
return array_map('reset', $result);

您去那里:)

10年后,我添加了另一个答案,我希望更好。再次,我10年前提到的文档很有帮助:

  • Query#getArrayResult():检索一个数组图(嵌套数组),该图形与Query#getResult()生成的对象图在很大程度上可互换,以便仅读取目的。。
  • Query#getScalarResult():检索一个可以包含重复数据的标量值的平面/矩形结果集。纯/混合区别不适用。

orm表示对象键合映射器:它用对象图映射RDBMS。一方面,您拥有表格数据,另一方面,您的对象可以彼此相关。

使用getArrayResult()时,您将获得一个数组图,意思是(深度)嵌套的东西,例如JSON文档。

使用getScalarResult()时,除了将列名称转换为字段名称之外,几乎没有干预措施,这就是为什么它可以包含重复的数据。因此,例如,如果您编写一个用2个语音器检索用户的查询,前者将为您提供

之类的东西
[0 => [
    'lastname' => 'Anderson',
    'firstname' => 'Thomas',
    'phoneNumbers' => [[
        'alias' => 'home',
        'number' => '0123456789',
    ], [
        'alias' => 'work',
        'number' => '987654321',
    ]],
]]

后者将为您提供一些平坦而重复的东西,例如:

[0 => [
    'lastname' => 'Anderson',
    'firstname' => 'Thomas',
    'alias' => 'work',
    'number' => '987654321',
    ],
],
1 => [
    'lastname' => 'Anderson',
    'firstname' => 'Thomas',
    'alias' => 'work',
    'number' => '987654321',
]]

当然,如果您的查询足够简单,则没有区别。

相关内容

  • 没有找到相关文章

最新更新