使用DataMapperORMForPHP映射字段名
我正在考虑将DataMapper ORM与CodeIgniter结合使用,但有一个数据库结构形式不良的场景 我希望能够将我的模型配置为将数据库字段名映射到更符合逻辑的内容。然后,当我们开始更新数据库结构时,我可以只更新模型,所有引用代码都将继续工作使用DataMapperORMForPHP映射字段名,php,codeigniter,orm,codeigniter-datamapper,Php,Codeigniter,Orm,Codeigniter Datamapper,我正在考虑将DataMapper ORM与CodeIgniter结合使用,但有一个数据库结构形式不良的场景 我希望能够将我的模型配置为将数据库字段名映射到更符合逻辑的内容。然后,当我们开始更新数据库结构时,我可以只更新模型,所有引用代码都将继续工作 使用DataMapper ORM是否可以实现这一点?是的,这是可能的。我可以解释逻辑以及如何使用codeigniter应用程序的自定义核心类来解决问题 在application/core/中创建一个文件,并将其标记为Mapdm.php 在文件中写入以
使用DataMapper ORM是否可以实现这一点?是的,这是可能的。我可以解释逻辑以及如何使用codeigniter应用程序的自定义核心类来解决问题 在application/core/中创建一个文件,并将其标记为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\u field\u config.php(文件内容)
控制器文件设置
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对象。您可以在表上创建一个视图,根据需要映射字段,然后将该视图用作ORM类。我曾在Propel中使用过这种技术,其中一些列需要子选择,而子选择太复杂,无法维持通常的方式,而且它确实工作得很好。您能再举一些例子吗?您现在的结构有哪些不好?您希望在ORM实体中进行哪些更改?
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();
}
}