1

如何制作类似于经典 PHP PDO 的东西

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

在教义 1.2 中。

我试过了

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

但它总是只返回找到的第一个对象。

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

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

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

4 回答 4

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();
   ....       
}

在教义文档中找到了这一点

于 2012-12-07T22:59:38.757 回答
0

你有没有尝试过:

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

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

while ($obj = $query->execute(array(), Doctrine_Core::HYDRATE_ARRAY)) {...}
于 2012-07-17T13:47:33.850 回答
0

如果您有连接,请这样做:

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

fetchOne()您一起,您只会得到一个条目。

于 2015-04-20T10:26:53.410 回答
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
}

更多信息:数据水合器 — Doctrine 1.2.4 文档

于 2015-10-16T16:19:47.667 回答