我有某些用例,我需要在没有分页的情况下显示数据集。为了节省内存,我宁愿使用学说的批处理处理功能(查询迭代器)。
我想知道twig是否提供任何机制(编写我自己的扩展名是可以的),以便像我在任何其他集合中一样将for tag与迭代器结果集使用。
然后在我的扩展中(或任何处理迭代过程),我将在使用时分离它们。
到目前为止,我认为我唯一的选择是为标签创建自定义,因为我认为Twig的标签没有处理此操作。
考虑到:
- 学说的迭代器使用PDO的提取方法(一次仅使用一个对象)
- 学说的迭代器实现PHP的迭代界面
而不是通过:
$query->getResult()
到树枝,您可以通过:
$query->iterate()
然后在树枝中而不是这样做:
{% for item in result %}
{# do work with item #}
{% endfor %}
应该是:
{% for item in result %}
{# doctrine's iterator yields an array for some crazy reason #}
{% set item = item[0] %}
{# do work with item #}
{# the object should be detached here to avoid staying in the cache #}
{% endfor %}
此外,loop.last变量停止工作,因此,如果您使用它,则应该找出另一种解决问题的方法。
最后,我没有编写自定义的树枝标签,而是创建了一个用于处理我需要的额外内容的教义迭代器,而是唯一的破坏是循环。lastvar:
class DoctrineIterator implements Iterator {
public function __construct(Iterator $iterator, $em) {
$this->iterator = $iterator;
$this->em = $em;
}
function rewind() {
return $this->iterator->rewind();
}
function current() {
$res = $this->iterator->current();
//remove annoying array wrapping the object
if(isset($res[0]))
return $res[0];
else
return null;
}
function key() {
return $this->iterator->key();
}
function next() {
//detach previous entity if present
$res = $this->current();
if(isset($res)) {
$this->em->detach($res);
}
$this->iterator->next();
}
function valid() {
return $this->iterator->valid();
}
}