您的函数在Zend_Model中的具体程度如何?

时间:2011-09-08 09:25:12

标签: php zend-framework

如果有人可以帮我解决一个概念问题那就太棒了:假设我有一个处理名为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');
}

无论如何..你们如何处理这个可能是常见的问题?

2 个答案:

答案 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');

只是一个简单的例子,你需要解决这个问题。成功了!