在我的Mapper类中,我将AbstractDbMapper
从ZfcBase
扩展到从数据库中获取行。一个简单的例子就是这样的代码:
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()中的代码才能获得所需的行为,还是有更简单的方法?
顺便说一句:甚至建议返回一个数组或像这样转换它?谢谢你的帮助!
答案 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;
}
这将返回一个对象数组