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

时间:2013-05-16 14:28:18

标签: zend-framework zend-framework2 zend-db

在我的Mapper类中,我将AbstractDbMapperZfcBase扩展到从数据库中获取行。一个简单的例子就是这样的代码:

class MyMapper extends AbstractDbMapper
{

    //...

    public function fetchAll() {
        $select = $this->getSelect();
        return $this->select($select); // returns HydratingResultSet
    }
}

问题在于$this->select()返回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
}

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

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

2 个答案:

答案 0 :(得分:4)

更新:

有更清洁的可能性(来自https://stackoverflow.com/a/19266650/1275778的豪华轿车)。改编自上面的例子,它的工作原理如下:

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

如果豪华轿车在这里发布他的答案,我会很乐意接受它。

旧回答:

由于没有人可以回答我的问题,我尝试实施最干净的选项(对我而言):扩展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;
    }
}
select()中的

MyAbstractDbMapper现在返回一个对象数组,而不是HydratingResultSet

由于这种情况越来越低,有人可以解释一下原因吗?

答案 1 :(得分:1)

通常你已经得到了对象类,所以只需弹出对象(类)的实例:

public function fetchById($id) {

    [...]

    $resultSet = $this->getDbTable()->fetchAll($select);
    $entries   = array();

    foreach ($resultSet as $row) {
        $entries[] = $this->populate($row);
    }

    return $entries;
}

并且populate函数看起来像这样:

private function populate($row)
{
    $entry = new Application_Model_YourModel();

    $entry->setId($row->id);

    [...] //set other object values

    return $entry;
}

这将返回一个对象数组