php – 数据映射器模式:来自服务层的Complexe查询
发布时间:2020-12-13 17:54:17 所属栏目:PHP教程 来源:网络整理
导读:我在Zend Framework中唱出数据映射器模式.到目前为止,这种方法运作良好,但现在我需要你的帮助/意见.那么让我们从代码开始: 我们得到了一个有几个人的桌子: CREATE TABLE `persons` ( `id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL,`a
我在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 …’),这会打破数据映射器模式吗?
实际上,对于两个条件,不建议在一个条件上查询,然后在迭代时过滤另一个条件.对于两个以上的条件,它没有明确的方法.并且实现分页适配器变得相当混乱.
在我看来,问题是你的mapper fetch()方法只支持允许一个条件.所以: >修改签名以支持一系列条件.>或者,您可以为每个增强的提取方法创建单独的mapper方法,例如:fetchByHairAndAge($hair,$age)等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |