1

所以我在 CodeIgniter 的扩展模型(MY_Model)中有这段代码:

function get($options = array(), $selects = array(), $joins = array(), $table, $object = TRUE)
{

    if(!empty($options))
    {
        foreach($options as $option => $array)
        {
            foreach($array as $column => $value)
            {
                $this->db->{$option}($column, $value);
            }
        }
    }

    if(!empty($select))
    {
        foreach($selects as $select)
        {
            $this->db->select($select);
        }
    }

    if(!empty($joins))
    {
        foreach($joins as $join => $array)
        {
            foreach($array as $jointable => $column)
            {
                $this->db->join($join, $join.'.'.$column.'='.$jointable.'.'.$column);
            }
        }
    }


    $query = $this->db->get($table);

    return $query->result();

}

我可以在其中传递如下数组:

    $options = array(
        'where' => array(
            'companys.companyID' => $companyID
        )
    );

    $select = array(
        'companyID',
        'companyName'
    );

    $join = array(
        'persons' => array(
            'companys' => 'companyID'
        )
    );

    $result = $this->companyModel->get($options, $select, $join, 'companys');

    print_r('<pre>');
    print_r($result);

我的问题是,这不是一个好主意是否有原因。我在自己的MY_Model中扩展了默认的CI_Model,然后所有其他模型都可以使用这个get,并且仍然有自己的功能。对于其他基本的 CRUD 操作,我有类似的功能。

另一种方法是在模型中分离功能以完成大部分工作并尽可能使用最小的控制器是最佳路线。即使这意味着您在所有模型中都编写相同的代码?

希望这不是一个愚蠢的问题,或者我误解了 MVC 的核心内容,但无论如何感谢您的回复。

4

1 回答 1

0

欢迎一长串试图抽象 sql 的开发人员。;)

数据库抽象是 Web 应用程序中的核心概念,但绝不是 MVC 模式的一部分,因为模型只是被描述为应该反映您的领域的数据和方法的集合。实际上,这通常意味着有业务方法和回调可以做到这一点。如何持久化数据取决于您。示例模式让您对应该做什么有所 了解还要看看 Doctrine 恰好在 1.x 版本中使用ActiveRecord并且最近在 2.0 版本中更改了它以获得更简单的带有工厂的实体模式

你的方法对我来说看起来不错。但是有一个警告:不要弯曲太多。如果您正在编写应用程序而不是框架,那么您不仅可以在业务方面而且在技术方面都可以自由地拥抱您的领域。如果您发现自己正在处理使用此方法无法完成的查询,请不要更改方法,而只需使用真实查询即可。

于 2011-10-19T08:51:03.027 回答