如果我使用 Hydrator 将我的查询结果的值放入我的模型的一个实例中,我将不得不循环两次结果(一次用于水合每一行/对象,然后在我实际使用结果时再次)。
我知道有多种PDO_FETCH_*
模式,例如FETCH_INTO
和FETCH_CLASS
似乎可以实现相同的功能。我能看到的唯一区别是在水合过程中操纵数据的潜力。
我只是想弄清楚当它们需要对结果集进行额外迭代时使用水合器的原因。我觉得必须有一些理由或方法来使额外的迭代可以接受,我很好奇它是什么。我不确定为什么像 hydrators 这样的编程模式如此流行,因为从表面上看,在大多数情况下它似乎是一种浪费。在水合期间操纵数据是使用水合器的唯一原因吗?
映射器的“查找全部”方法:
($this->hydrator
是 的一个实例Zend\Stdlib\Hydrator\ArraySerializable
,但为了这个问题的目的,可以用任何其他水合器代替。)
/*
* @return array|PagesInterface[]
*/
public function findAll(){
//Perform select
$sql = "SELECT * FROM CMSMAIN";
$stmt = $this->dbal->prepare($sql);
$result = $stmt->execute();
if($result === true){
//$stmt->setFetchMode(\PDO::FETCH_CLASS, $modelGoesHere); //Using FETCH_CLASS populates the model directly eliminating the need for the extra iteration.
$records = $stmt->fetchAll();
$rows = array();
foreach($records as $value){ //First Loop to hydrate
$rows[] = $this->hydrator->hydrate($value, new PagesModel($this->logger));
}
return $rows;
}
return array();
}