加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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 …’),这会打破数据映射器模式吗?
我不喜欢那些额外的foreach循环,感觉我做错了,所以我写了这个问题.

实际上,对于两个条件,不建议在一个条件上查询,然后在迭代时过滤另一个条件.对于两个以上的条件,它没有明确的方法.并且实现分页适配器变得相当混乱.

在我看来,问题是你的mapper fetch()方法只支持允许一个条件.所以:

>修改签名以支持一系列条件.>或者,您可以为每个增强的提取方法创建单独的mapper方法,例如:fetchByHairAndAge($hair,$age)等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读