基於CI的model,不同資料表或資料選擇的替換模式。

edited 十一月 -1 in 其他
其實敝人對於設計模式大致還有很多的不了解。
只是就model的方法因為實在覺得不斷的開方法一直寫也不是個對策。
尤其對應到不同的資料表就要重設一次model也挺麻煩的。
之前有做共用繼承某些特定模式,但事實上有的時候對資料的搜尋條件並不是那麼
的單一或單純。
以下針對取得某筆單一資料的做法提供參考。
my_model.php(direct is models)
-------------------------------

class my_model extends model{

var table;

function my_model(){
parent::model();
}

function select_row($id,$ob_model = 'md_user'){
$this->load->library($ob_model);
$this->$ob_model->db = $this->db;
return $this->$ob_model->row($id);
}

}



md_user.php(direct is libraries)
--------------------------------

class md_user{

var $db;
var $table = 'user';

function md_user(){

}

function row($id){
$this->db->where('id',$id);
$query = $this->db->get($this->table);
if($query->num_rows() != 0)
return $query->row();
return false;
}

}



主程式使用時:
假設設定model:$this->load->model('my_model','MYMODEL',TRUE);
                                                                                
function show_user_data(){
$data['row'] = $this->MYMODEL->select_row($id,'md_user');
$this->load->view('show_user_data',$data);
}

這個模式的寫法是說,在主程式僅需要載入一個model。
而不需要為了不同的model去寫很多model(往往其實不同的model檔案功能都差不多)
方法上來說,取得單筆資料就是一個select_row()的功能。
至於功能要傳回什麼,全看library的物件怎麼去闡述需要的條件。
有的時候可能是關聯式資料的查詢回傳。
有的時候也許會是複合性條件。
但不管是什麼,只要是取得多筆資料可能就統一行為叫做select_query()
取得單筆就統一行為叫做select_row()
至於怎麼查,查詢的條件,查什麼資料表,就交給library物件去實做就行了。

之所以會寫這個其實只是最近寫ci覺得針對不同的查詢要再開新的method真的不是
個好的策略。而且會造成model物件過度複雜化。
裡頭的功能寫太多,單純回頭看起來要嘛也不過就是要個物件集合。
要嘛也不過就是要一個單一資料物件。
何不乾脆就把主功能純化掉。
把不同的功能交給不同的物件去處理就好了。
重要的是:我要的就只是個資料結果而已。


原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=6131

評論

  • edited 七月 2011
    那不就是ORM了嗎 =.=
    我記得CI有ORM library
    應該不需要自己刻
    至於有沒有必要封這麼多method嘛...我覺得差別只是"想把程式寫在哪的問題"
    把業務邏輯跟資料模型分離,其實也沒有哪種做法會比較好
    分離後,邏輯類還是會對資料類有依存性,當然..還有一種方式是用HMVC,不過實際上要這麼幹的話...,乾脆把邏輯全寫在Controller裡
    不分離,就是model中的method越來越多,大概一陣子就要拆method做更細微的封裝
    然後情形就變的很詭異....

    function a()
    {
    if($this->b())
    {
    $x=$this->c();
    }
    else
    {
    $x=$this->d();
    }
    return $this->y($x);
    }

    做細微封裝後,對原本寫的人沒啥差別,但對接手的人會顯的非常難進入狀況...囧
  • edited 七月 2011
    HMVC其實用過了。
    不過後來基於很多因素又將他拋棄了。
    更深一層來說,其實我想抓的是軟體設計的方法和原則。
    而不單純只是基於用法。
    簡單的說,像是ci有提供active record了。
    我卻還是自己寫了一個一樣的東西出來。
    並非是說這麼做浪費時間,純粹就只是個人研究而已。
    畢竟雖然現在是什麼都有的情況下,我還是預防萬一什麼都沒有的情形。
    (尤其萬一是接手別人寫的code的時候)
  • edited 七月 2011
    抓原則的話,也許可以參考:
    http://martinfowler.com/eaaCatalog/index.html
    例如Table Data Gateway, Row Data Gateway, Active Record, Data Mapper等(不過這裡講的Active Record可能會跟我們常看到的不同)

    裡面有提到幾種設計。另外,在Java中,這個:http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
    也很常用。

    另外,可以把基本操作放進一個base class,其他model就繼承他。這樣這些簡單的資料操作就不用重寫。
  • edited 七月 2011
    繼承體本身的想法之前就有做過。
    不過今天的問題點出在:只想呼叫同一個方法,卻要求他回應不同的條件產生的查詢。
    這個才是目的。
    事實上所需要抽取出來的就是不同層面的東西,卻要求他必須使用統一的名稱。
    另一個原則就是必須讓同一個model能夠去對應不同的資料表。
    不過昨天有人跟我談過一些資料設計的架構原則,目前也在研究思考。
    只是比起這個,現在也很專心在了解CI 2.0的東西。
    畢竟目前手上的案子都是CI 1.7的版本。
Sign In or Register to comment.