gpt4 book ai didi

php - 数据映射器模式 : Complexe query from Service Layer

转载 作者:可可西里 更新时间:2023-11-01 12:53:41 25 4
gpt4 key购买 nike

我赞扬 Zend Framework 中的数据映射器模式。到目前为止效果很好,但现在我需要你的帮助/意见。那么让我们从代码开始:

我们有一张有几个人的 table :

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;
}

我想我用这种方法遵循数据映射器模式......


现在是问题:

我想选择拥有棕色头发且年龄小于 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 循环。


我的问题:

您将如何在数据映射器模式中执行此操作?如果我执行原生 SQL 查询,如 $serviceLayer->mapper->table->qry('SELECT ...'),这是否会破坏数据映射器模式?我不喜欢那些额外的 foreach 循环,感觉我做错了什么,所以我写了这个问题。

最佳答案

确实,对于两个条件,在迭代时先查询一个条件然后再过滤另一个条件是不可取的。对于两个以上的条件,您没有明确的方法。实现分页适配器变得非常困惑。

在我看来,问题在于您的映射器 fetch() 方法支持仅允许一个条件。所以:

  1. 修改签名以支持一系列条件。

  2. 或者,您可以为每个增强的获取方法创建一个单独的映射器方法,例如:fetchByHairAndAge($hair, $age) 等。

关于php - 数据映射器模式 : Complexe query from Service Layer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com