2011-05-01 5 views
3

DataMapper ORM을 CodeIgniter와 함께 사용하고 있지만 데이터베이스 구조가 제대로 구성되어 있지 않은 시나리오가 있습니다.DataMapper ORM을 사용하여 PHP에서 필드 이름 매핑

내 모델을 구성하여 데이터베이스 필드 이름을 더 논리적으로 매핑 할 수 있기를 바랍니다. 그런 다음 데이터베이스 구조를 업데이트하려고하면 모델을 업데이트 할 수 있으며 모든 참조 코드가 계속 작동합니다.

DataMapper ORM에서 가능합니까?

+0

몇 가지 예를 추가 할 수 있습니까? 현재 저조한 구조가 있습니까? ORM 엔티티에서 어떤 변경을하고 싶습니까? – Casey

답변

1

예 가능합니다. 논리와 코드 네이 터 애플리케이션에 대한 커스텀 코어 클래스를 사용하여 문제를 해결할 수있는 방법을 설명 할 수 있습니다.

응용 프로그램/코어 내부의 파일을 생성/그것을 쓰기 파일 내부에 다음

을 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과 함께 사용했는데, 일부 컬럼은 일반적인 선택을 유지하기에는 너무 복잡했을 subselect를 필요로했으며 실제로 잘 작동했다.