在symfony中渲染巨大的表

时间:2014-05-15 10:28:59

标签: php symfony doctrine twig

我必须在symfony中创建一个后端页面,该页面预计会生成一个包含数千行的表。

我知道通常这是"不太好",但在这种情况下,我无法添加分页按钮和类似的东西,因为此页面用作从网站外部导出数据的方式:换句话说,如果需要几分钟才能渲染它并不重要,但是当可见时,这个页面必须包含我需要的所有数据。然后,我将通过将此页面限制为允许访问它的唯一用户来处理潜在的安全问题。

但是,如果我依赖于通常的symfony MVC结构,我就会因为在将所有数据发送到缓冲区模板之前将所有数据存储在缓冲区模板中而导致内存错误。

您是否知道它是否存在一种简单的方式来呈现此页面而不会引起内存消耗问题?在普通的PHP中,我只需创建一个迭代,从查询中提取部分结果并每次渲染表的一部分,但是我可以通过遵循symfony Controller-> twig Template结构来做类似的事情吗?

2 个答案:

答案 0 :(得分:1)

传统的方法是使用查询的两种变体。

  1. 包括分页,但设置范围和最大结果。

  2. 实际上,第一个查询扩展了第二个查询但添加了范围过滤器,但是当您请求导出时,第二个查询的结果将作为文件流式传输,从而允许非常大的下载。此外,您可以单独选择每一行并转储它。

    你应该能够使用$query->iterate()一次获取一个,虽然我没有测试过这种方法的行为,文档暗示它不会一次性加载它们。

    http://www.doctrine-project.org/api/orm/2.4/source-class-Doctrine.ORM.Query.html#563-577

    一个有用的导出表单是CSV,您可以使用PHP内置函数编写。

答案 1 :(得分:0)

如果您不需要在表格中包含每个字段,尤其是最大字段,则可以使用部分查询仅返回需要显示的字段。我用它来在单个页面上返回超过20k行的数据,其中5或6个短文本字段在一行上对齐。

$q = $em->createQuery("select partial u.{id,name} from MyApp\Domain\User u");

请参阅doctrine2 docs here