如果有人可以帮我解决一个概念问题那就太棒了:假设我有一个处理名为Persons的表的模型。通常我会有一个像这样的标准提取函数:
public function fetchPersonById($person_id)
{
$result = 0;
if ((int)$person_id > 0) {
$select = $this->select()
->from($this->_name, array('Id' => 'Person_Id',
'Name' => 'Person_Name',
'Age' => 'Person_Age',
'Sex' => 'Person_Sex'));
->where('Person_Id = ?', $person_id);
$result = $this->fetchRow($select);
}
return $result;
}
现在假设由于某种原因,我需要通过它的名字来获取一个人的性别......以及之后它的年龄由它的名字命名。你会添加不同的功能,如:
public function fetchPersonSexByName($person_name)
{
// ...
->from($this->_name, array('Sex' => 'Person_Sex');
->where('Person_Name = ?', $person_name); ...
// ...
}
等等......过了一段时间你可以看到自己有成千上万的这样简短的方法..你们是那些特定的或者你们拉扯整个记录(fetchall)而不是后来的代码只是保留列你想用吗?在这种情况下你不会打破整个MVC,因为如果我想得到 某人的性别我的模型(或者是调用该函数的人)需要知道数据库中的列名?
我还想做一些比较通用的事情,比如
public function $this->fetchColumnA_By_ColumnB_ColumnBValue($columnA_name,
$columnB_name, $columnA_name)
{
//...
}
而不是让我的简短方法来调用这个更灵活的专栏。所以我会有类似的东西:
public function fetchPersonSexByName($person_name)
{
//...
$this->fetchColumnA_By_ColumnB_ColumnBValue('sex', 'name', 'martin');
}
无论如何..你们如何处理这个可能是常见的问题?
答案 0 :(得分:0)
我倾向于做你最后一个通用示例的版本。 泛型方法将受到保护(甚至是私有),您的更具体(公共)方法会调用此方法。为了避免代码重复。
但是,我不确定我会怎么样。可能只是......
protected function _fetchColumnById($id, $column) {...}
protected function _fetchColumnByName($name, $column) {...}
......但这取决于要求。
你可以看到成千上万的简短方法
如果你认为你会得到1000个请求,那么读取整个记录并以某种方式缓存它可能会更好吗?
答案 1 :(得分:0)
你可以做的是在你的模型或他的父母中制作一个神奇的__call函数。
如果某种方法不存在,它将通过该神奇功能。类似的东西:
class Model_Test {
public function __call($method, $args) {
if(preg_match('/fetch([a-zA-Z]+)by([a-zA-Z]+)/i', $method, $result)) {
$fetch = $result[1];
$column = $result[2];
echo 'SELECT ' . $fetch . ' FROM test WHERE ' . $column . ' = "' . (string)$args[0] . '"';
//build your query here and make sure you make it secure with bind param, etc.
} else {
//call parent __call? Or throw an error?
}
}
}
$model = new Model_test();
$model->fetchSexByName('martin');
只是一个简单的例子,你需要解决这个问题。成功了!