如何在Doctrine 1.2中逐一获取结果?

时间:2012-07-17 13:41:26

标签: php doctrine dql doctrine-1.2

如何制作类似于经典PHP PDO的内容

while ($obj = $stmt->fetch()) {...}

在Doctrine 1.2中。

我试过

while ($obj = $query->fetchOne()) {...} 

但它始终只返回找到的第一个对象。

我有什么办法可以实现这种行为吗?

我的查询并不重要。这是一个简单的(注意我在模型的* Table类中)

$query = $this->createQuery('a');

4 个答案:

答案 0 :(得分:1)

在symfony2中处理迁移命令时,我发现$query->executes();在返回之前将完整的结果集提取到RAM中。

这对于少量数据来说不是问题,但是如果结果更大,您的进程可能会运行OutOfMemory。

要解决此问题,您可以使用以下语句“逐个”迭代结果:

$query->iterate();

我认为这个PDO声明类似于:while ($obj = $stmt->fetch()) {...}

更完整的示例可能如下所示:

$em = $this->getContainer()->get('doctrine');
$iterator = $em->getRepository('AcmeBundle:Entity')
               ->createQueryBuilder('e')
               ->getQuery()->iterate();

foreach($iterator as $item){
   $item = $item[0];

   // Your logic here:
   $item->getId();
   ....       
}

doctrine documentation

中找到了这个

答案 1 :(得分:0)

你试过了吗?

while ($obj = $query->execute()) {...}

如果你想获取数组而不是对象:

while ($obj = $query->execute(array(), Doctrine_Core::HYDRATE_ARRAY)) {...}

答案 2 :(得分:0)

如果你有连接,那就这样做:

$stmt = $conn->query($queryString);
while ($obj = $stmt->fetch()) {...} 

使用fetchOne(),您只能获得一个条目。

答案 3 :(得分:0)

使用水合物模式Doctrine_Core::HYDRATE_ON_DEMAND

$q = Doctrine_Query::create()
                ->select('...')
                ->from('...');

// Returns instance of Doctrine_Collection_OnDemand
$result = $q->execute(array(), Doctrine_Core::HYDRATE_ON_DEMAND);
foreach ($result as $obj)
{
    // do something with your object
}

更多信息:Data Hydrators — Doctrine 1.2.4 documentation