将Zend\Db\ResultSet\HydratingResultSet转换为对象数组

lor*_*rey 5 zend-framework zend-db zend-framework2

在我的映射器类,我延长AbstractDbMapperZfcBase从数据库中提取行.一个简单的例子就是这样的代码:

class MyMapper extends AbstractDbMapper
{

    //...

    public function fetchAll() {
        $select = $this->getSelect();
        return $this->select($select); // returns HydratingResultSet
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是$this->select()返回a Zend\Db\ResultSet\HydratingResultSet(包含所需和水合物体).但我想返回这些对象的数组而不是HydratingResultSet包含对象的数组.

首先要看的是,HydratingResultSet::toArray()但这会返回一个多维数组,而不是一个对象数组.

所以我选择手工完成:

public function fetchAll() {
        $select = $this->getSelect();

        $results = array();
        foreach ($this->select($select) as $object) {
            $results[] = $object;
        }
        return $results; // returns array of needed objects
}
Run Code Online (Sandbox Code Playgroud)

这有效,但在每个获取方法中都看起来很难看.我是否必须修改select()中的代码才能获得所需的行为或者是否有更简单的方法?

顺便说一句:甚至建议返回一个数组或像这样转换它?谢谢你的帮助!

lor*_*rey 5

更新:

有一种更干净的方法可以做到这一点(来自/sf/answers/1348665531/的limos )。从上面适应我的示例,它的工作方式如下:

public function fetchAll() {
    $select = $this->getSelect();
    $results = $this->select($select);
    return \Zend\Stdlib\ArrayUtils::iteratorToArray($results); // returns desired array of objects
}
Run Code Online (Sandbox Code Playgroud)

如果limos在这里发布他的答案,我会很乐意接受。

旧答案:

由于没有人能够回答我的问题,因此我尝试实现最干净的选项(对我而言):扩展AbstractDbMapper以添加上述功能。我在这里为寻求解决方案的任何人提供文档:

MyAbstractDbMapper extends AbstractDbMapper
{
    /**
     * @param Select $select
     * @param object|null $entityPrototype
     * @param HydratorInterface|null $hydrator
     * @return array
     */
    protected function select(Select $select, $entityPrototype = null, 
        HydratorInterface $hydrator = null)
    {
        $resultSet = parent::select($select, $entityPrototype, $hydrator);
        $results = array(); // Array of result objects
        foreach ($resultSet as $object) {
            $results[] = $object;
        }
        return $results;
    }
}
Run Code Online (Sandbox Code Playgroud)

select()MyAbstractDbMapper现在返回对象的数组代替HydratingResultSet

由于这种说法不合时宜,有人可以解释为什么吗?