2011-05-01 15 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中使用了这种技术,其中一些列需要使用子查询,而这些查询本来就太复杂了,无法保持通常的方式,而且确实工作得很好。

相关问题