0

我正在为数据提供者构建一个抽象层。数据的每个组件都有自己的存储库,它返回实体集合。存储库具有三个公共方法:

public function fetchAll();    
public function findById($id);
public function find(Query $query);

当调用 'fetchAll' 方法时,会创建并执行一个 PDO 语句。然后将该查询的结果初始化为 ZF2 HydratingResultSet 对象,这样当它被迭代时,每个项目都会被 hydrator 正确地创建为一个实体。

然而,当我试图确定如何最好地在集合上“设置”这个结果集时,问题就出现了。到目前为止,我已经完成了以下工作:

  • 直接在集合上设置“HydratingResultSet”对象,并将迭代器接口方法“代理”到集合中的结果集属性。例如:

    protected $hydratingResultSet;
    
    public function current()
    {
        return $this->hydratingResultSet->current();
    }
    
  • 遍历结果集并将每个水合实体添加到集合中。例如:

    foreach ($hydratingResultSet as $entity) {
        $collection->add($entity);
    }
    

前者似乎可以更好地处理大型结果集,因为查询缓冲意味着实体仅在迭代集合时才被水合。但是,我担心我已经将驱动程序与集合紧密耦合,这可能会破坏某些缓存策略。此外,这意味着我永远无法序列化或反序列化集合,因为 PDO 语句显然不允许这样做。

然而,后一种方法在 PHP 中很快就会耗尽内存,这是可以理解的大型结果集。理想情况下,我更喜欢使用这种做事方式,因为这样处理起来会好很多,但内存问题目前让我很困扰。

有人可以就此提供任何建议吗?是否有不同的选择或解决问题的不同方法?

4

0 回答 0