CodeIgniter で DataMapper ORM を使用することを検討していますが、データベース構造が適切に形成されていないシナリオがあります。
データベースのフィールド名をより論理的なものにマップするようにモデルを構成できるようにしたいと考えています。次に、データベース構造の更新に取り掛かると、モデルを更新するだけで、すべての参照コードは引き続き機能します。
これは DataMapper ORM で可能ですか?
CodeIgniter で DataMapper ORM を使用することを検討していますが、データベース構造が適切に形成されていないシナリオがあります。
データベースのフィールド名をより論理的なものにマップするようにモデルを構成できるようにしたいと考えています。次に、データベース構造の更新に取り掛かると、モデルを更新するだけで、すべての参照コードは引き続き機能します。
これは 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_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 オブジェクトに返す必要があります。
テーブルにビューを作成し、必要に応じてフィールドをマッピングし、そのビューを ORM クラスとして使用できます。私はこの手法を Propel で使用しましたが、一部の列では複雑すぎて通常の方法を維持できない部分選択が必要でしたが、実際に非常にうまく機能しました。