2011-10-19 53 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

您的方法是,看起來很好。但有一個警告:不要彎曲太多。如果你正在編寫一個應用程序而不是一個框架,你可以自由地接受你的領域,不僅在業務上,而且在技術方面。如果您發現自己處理的查詢不可能使用此方法,請不要更改該方法,而只需使用真正的查詢。

相關問題