【发布时间】:2013-05-16 14:28:18
【问题描述】:
在我的 Mapper 类中,我从 ZfcBase 扩展 AbstractDbMapper 以从数据库中获取行。一个简单的例子是这样的代码:
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() 中的代码才能获得想要的行为,还是有更简单的方法?
顺便说一句:是否甚至建议返回一个数组或像这样转换它?感谢您的帮助!
【问题讨论】:
-
你需要一个数组有什么原因吗?结果集可以很好地用作迭代器,并且可以在大多数情况下使用。没有内置方法可以在不执行您现在正在执行的操作的情况下获取数组,您可以将该方法添加到 Mapper 或只是 Hydrator 作为快捷方式.
-
我在我的控制器中使用这些结果,并且认为使用数组而不是一些 Zend\Db 对象会更干净。我不明白他们为什么选择这样做......
-
他们选择这样做是因为您可以获得额外的功能,例如缓冲结果集等。想想如果您有 900 万个对象的集合,您的数组将变得巨大并消耗 RAM,其中这个集合的项目是一次按需制作的,效率更高。
-
好吧,这听起来很合理。非常感谢,我没有想到。如果有一个内置函数来检索整个数组,那至少会很好,因为这将满足大多数情况下恕我直言的需要。我现在手动添加。
-
这确实是 Zend 内部的不一致。看到这个问题:github.com/zendframework/zf2/issues/4635
标签: zend-framework zend-framework2 zend-db