我正在尝试使用以下查询从表格通过学说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',
]]
当然,如果您的查询足够简单,则没有区别。