2011-10-19 60 views
1

所以我有一个扩展模型(MY_Model)CI中的一句代码:使用单个get函数适用于所有型号

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的核心,但是谢谢你的回复。

回答

0

欢迎在开发人员试图抽象SQL的长长的一行。 ;)

数据库抽象是Web应用程序中的核心概念,但绝不是MVC模式的一部分,因为Model只是被描述为应该反映您的域的数据和方法的集合。事实上,这通常意味着有这样的商业方法和回调。你如何坚持你的数据取决于你。给你一些想法应该完成的示例模式是here。另外看看Doctrine,在版本1.x中恰好使用ActiveRecord,并且最近在版本2.0中更改了这个版本,其中带有factorys的简单Entity-Pattern

您的方法是,看起来很好。但有一个警告:不要弯曲太多。如果你正在编写一个应用程序而不是一个框架,你可以自由地接受你的领域,不仅在业务上,而且在技术方面。如果您发现自己处理的查询不可能使用此方法,请不要更改该方法,而只需使用真正的查询。

相关问题