使用 DataMapper ORM for php 映射字段名称
Posted
技术标签:
【中文标题】使用 DataMapper ORM for php 映射字段名称【英文标题】:Using DataMapper ORM for php to map field names 【发布时间】:2011-05-01 23:09:50 【问题描述】:我正在考虑将 DataMapper ORM 与 CodeIgniter 一起使用,但有一种情况是数据库结构格式不正确。
我希望能够配置我的模型以将数据库字段名称映射到更合乎逻辑的名称。然后,当我们开始更新数据库结构时,我可以只更新模型,所有引用代码都会继续工作。
DataMapper ORM 可以做到这一点吗?
【问题讨论】:
你能举一些例子吗 - 你现在有什么糟糕的结构?您想对 ORM 实体进行哪些更改? 【参考方案1】:是的,这是可能的。我可以解释逻辑以及如何使用 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_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 模型创建一个包装器对象并使用包装器调用方法和属性。包装器应始终检查并将正确的表字段名称返回给数据映射器对象。
【讨论】:
【参考方案2】:您可以在表上创建一个视图,根据需要映射字段,然后将该视图用作您的 ORM 类。我已经在 Propel 中使用了这种技术,其中某些列需要子选择,这太复杂而无法维持通常的方式,而且确实效果很好。
【讨论】:
以上是关于使用 DataMapper ORM for php 映射字段名称的主要内容,如果未能解决你的问题,请参考以下文章
ORM/DAO/DataMapper/ActiveRecord/TableGateway 的区别?