2011-05-01 88 views
3

我正在使用CodeIgniter使用DataMapper ORM,但有一個數據庫結構形成不良的場景。使用DataMapper ORM for php來映射字段名稱

我希望能夠配置我的模型來映射數據庫字段名稱,更合乎邏輯。然後,當我們開始更新數據庫結構時,我可以更新模型,並且所有引用代碼都將繼續工作。

DataMapper ORM可以嗎?

+0

你可以舉一些例子 - 你現在有什麼不好的結構?你想在ORM實體中做什麼改變? – Casey 2011-10-18 08:03:20

回答

1

是的,這是可能的。我可以解釋邏輯以及如何使用codeigniter應用程序的自定義核心類來解決問題。

創建內部應用程序/核心文件/並標記Mapdm.php

寫入文件裏面以下。

class Mapdm { 


    private $map_fields = array(); 


    function __construct($modelClass_name, $map_fields = array()){ 

     $this->_model = new $modelClass_name(); /* instantiate Model */ 
     $this->map_fields = $map_fields; 

    } 

    function __get($name){ 
     if(isset($this->map_fields[$name])){ 
      $name = $this->map_fields[$name]; 
     } 

     return $this->_model->{$name}; 

    } 

    function __set($name, $value){ 

     if(isset($this->map_fields[$name])){ 
      $name = $this->map_fields[$name]; 
     } 

     return $this->_model->{$name} = $value; 

    } 

    function __call($name, $args){ 

     return call_user_func_array(array($this->_model, $method), $args); 
    } 


} 

要在控制器中使用它,只需在控制器構造函數類中將此類實例化爲如下所示。爲了簡化數組中的表字段映射數據,您可以選擇將數組數據存儲在自定義配置文件中。

示例。 map_field_config.php(文件內容)

$config['mapfield'][{modelname}] = array ('fieldA'=>'real_fieldname', 'fieldB'=>'real_fieldname2'); 

控制器文件設置

class ControllerName extends CI_Controller{ 

    function __construct(){ 

     parent::__construct(); 

     $mapfields = $this->config->item('mapfield', $mapfields); 
     $model_fields = $mapfields['mymodel']; 

     $this->mymodel = new Mapdm('mymodel'); 

    } 

    function index(){ 

     $records = $this->mymodel->get(); 


     } 

} 

我沒有測試此代碼,但是我只是寫它給你的想法。這就像爲Datamapper模型創建包裝對象並使用包裝器調用方法和屬性。包裝應始終檢查並將正確的表字段名稱返回給datamapper對象。

0

您可以在表上創建視圖,根據需要映射字段,然後使用視圖作爲ORM類。我已經在Propel中使用了這種技術,其中一些列需要使用子查詢,而這些查詢本來就太複雜了,無法保持通常的方式,而且確實工作得很好。

相關問題