Php 迭代大量记录以生成条令中的报告
当我想要生成excel/pdf/任何报表时,迭代一个复杂查询的大量记录的最佳方法是什么Php 迭代大量记录以生成条令中的报告,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,当我想要生成excel/pdf/任何报表时,迭代一个复杂查询的大量记录的最佳方法是什么 即使使用数组迭代器,我也会遇到内存泄漏问题(这会将整个数组加载到内存中,而不是使用缓冲查询!)。我建议将理论迭代器与结合使用php://memory流: 下面的一个小代码示例用于csv导出 $em = $this->getDoctrine()->getManager(); $iterableResult = $em->getRepository('IterableBundl
即使使用数组迭代器,我也会遇到内存泄漏问题(这会将整个数组加载到内存中,而不是使用缓冲查询!)。我建议将
理论迭代器与结合使用php://memory
流:
下面的一个小代码示例用于csv
导出
$em = $this->getDoctrine()->getManager();
$iterableResult = $em->getRepository('IterableBundle:User')
->createQueryBuilder('a')
->getQuery()->iterate();
$handle = fopen('php://memory', 'r+');
$header = array('ID', 'First Name', 'Last Name', 'Email');
fputcsv($handle, $header);
while (false !== ($row = $iterableResult->next())) {
fputcsv($handle, (array)$row[0]);
$em->detach($row[0]);
}
rewind($handle);
$content = stream_get_contents($handle);
fclose($handle);
我不会说这是最好的方法,但当我需要处理大量数据时,我会转而使用Doctrine DBAL连接对象,只需使用我需要的信息构建定制sql查询。与使用ORM相比,位基本体,但这不是一种罕见的模式。到目前为止,您是否有任何查询的示例代码?@Kmeixner是一个由查询生成器根据用户提交的条件表单中的选项和条件组合而成的查询,但通常是一个有两个或三个连接的查询,我选择9行,然后生成excel文件,显示这列。这个解决方案几乎是完美的。问题是,当我的查询连接到多个One集合时,doctrine会抛出一个错误,“使用不允许的关联页面在类文档中使用fetch join进行迭代”。即使我按行集分组,例如计算“页面数”,它也会填充内存吗?因为它将把整个文件存储到php://memory
不应该是php://output
?