使用 Doctrine 获取多行单列数组
Posted
技术标签:
【中文标题】使用 Doctrine 获取多行单列数组【英文标题】:Fetch multi-row, single-column array using Doctrine 【发布时间】:2013-12-21 01:08:17 【问题描述】:我有一个像这样的 Doctrine fetch 语句
$query = "SELECT id FROM table LIMIT 2";
$result = $db->fetchAll($query);
这样返回数组:
Array
(
[0] => Array
(
[id] => 1
)
[1] => Array
(
[id] => 2
)
)
由于我获取的唯一列是 ID,因此我不需要数组范围那么深。有没有一种方便的方法可以让 Doctrine 在“平面”数组中返回结果,类似于 PDO 所做的:
$result = $db->query($query)->fetchAll(PDO::FETCH_COLUMN);
会回来
Array
(
[0] => 1
[1] => 2
)
目前我正在使用扁平化它
$result = call_user_func_array('array_merge', array_map("array_values", $result));
【问题讨论】:
虽然不是最优雅的做事方式,但 call_user_func_array 确实可以按预期工作并正确展平单个 getArrayResult(如果只有一列) 【参考方案1】:您可以简单地使用 PDO 功能(至少如果您有 mysql)。
$ids = $db
->executeQuery($query)
->fetchAll(\PDO::FETCH_COLUMN)
;
【讨论】:
【参考方案2】:要解决此问题,您必须制作自定义的学说水合器。
-
首先:制作自己的保湿剂
<?php
namespace MyProject\Hydrators;
use Doctrine\ORM\Internal\Hydration\AbstractHydrator;
class CustomHydrator extends AbstractHydrator
protected function _hydrateAll()
return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
-
将您的 hydrator 添加到 Doctrine 配置文件中:
<?php
$em->getConfiguration()->addCustomHydrationMode('CustomHydrator','MyProject\Hydrators\CustomHydrator');
-
最后你可以使用你的定制 hidrator 了:
<?php
$query = $em->createQuery('SELECT u FROM CmsUser u');
$results = $query->getResult('CustomHydrator');
【讨论】:
我需要做同样的事情,我希望有人已经发布了他们的定制保湿剂,但我似乎找不到任何东西。你们中的任何一个人都完成了这项任务吗? 找到它:techpunch.co.uk/development/…【参考方案3】:我找到了一个名为fetchFirstColumn
的方法,它似乎可以做到这一点。这可能是在后来的教义版本中添加的。我目前正在使用 Doctrine ORM 2.7.4。
我在 Symfony 中这样使用它:
$statement = $connection->prepare('SELECT foo FROM bar WHERE baz = :baz');
$statement->execute([':baz' => 1]);
$result = $statement->fetchFirstColumn();
$result 的值将是一个从 0 开始的数字索引数组,如下所示:
[
0 => 'foo1',
1 => 'foo2'
];
【讨论】:
【参考方案4】:使用 fetchAssoc 获取数据:
$result = $db->query($query)->fetchAssoc(PDO::FETCH_COLUMN);
你会得到一个这样的数组:
Array (
[id] => 11
)
【讨论】:
以上是关于使用 Doctrine 获取多行单列数组的主要内容,如果未能解决你的问题,请参考以下文章
Zend 2 Framework - Doctrine从给定的2个实体生成表
如何在 findAll() - Doctrine 中获取数组结果?