我在Zend Framework中唱出数据映射器模式.到目前为止,这种方法运作良好,但现在我需要你的帮助/意见.那么让我们从代码开始:
我们得到了一个有几个人的桌子:
CREATE TABLE `persons` ( `id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL,`age` int(3) NOT NULL,`haircolor` varchar(20) DEFAULT NULL,PRIMARY KEY (`id``),);
现在我尝试选择所有棕色头发的人.我在ServiceLayer中使用以下方法
public function getPeopleByHaircolor($hair) { return $this->getMapper()->fetch('haircolor = ?',$hair); }
Mapper中的方法如下所示:
public function fetch($condition,$value) { $resultSet = $this->getTable()->fetchAll($this->getTable()->select()->where($cond,$value)); $entries = array(); foreach($resultSet as $row) { $entry = new Default_Model_Person(); $entry->id = $row->id; $entry->name = $row->name; [...] } return $entries; }
我想我用这种方法遵循Data Mapper模式……
现在问题:
我想选择棕色头发且年龄小于20岁的人.
那我该怎么办呢?我的尝试:
public function getTeens($hair) { $rows = $this->getMapper()->fetch('haircolor = ?',$hair); $return = array(); foreach($rows as $row) { if((int)$row->age < 20) $return[] = $row; } return $return; }
但是如果你得到更多的变量,比如“棕色头发,年龄小于20岁,名字’Foo Bar’”,我需要越来越多的方法和/或foreach循环.
我的问题:
您将如何在Data Mapper模式中执行此操作?如果我执行本地SQL查询,如$serviceLayer-> mapper-> table-> qry(‘SELECT …’),这会打破数据映射器模式吗?
我不喜欢那些额外的foreach循环,感觉我做错了,所以我写了这个问题.