是否可以将 Doctrine2 批处理与 Twig 的标签无缝使用?



我有某些用例,我需要在没有分页的情况下显示数据集。为了节省内存,我宁愿使用学说的批处理处理功能(查询迭代器)。

我想知道twig是否提供任何机制(编写我自己的扩展名是可以的),以便像我在任何其他集合中一样将for tag与迭代器结果集使用。

然后在我的扩展中(或任何处理迭代过程),我将在使用时分离它们。

到目前为止,我认为我唯一的选择是为标签创建自定义,因为我认为Twig的标签没有处理此操作。

考虑到:

  1. 学说的迭代器使用PDO的提取方法(一次仅使用一个对象)
  2. 学说的迭代器实现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();
    }
}

相关内容

  • 没有找到相关文章

最新更新