Использование DataMapper ORM для php для сопоставления имен полей - PullRequest
3 голосов
/ 02 мая 2011

Я смотрю на использование DataMapper ORM с CodeIgniter, но у меня есть сценарий, когда структура базы данных плохо сформирована.

Я бы хотел настроить мою модель для сопоставления имен полей базы данных,к чему-то более логичному.Затем, когда мы приступим к обновлению структуры базы данных, я могу просто обновить модель, и весь ссылочный код продолжит работать.

Возможно ли это с DataMapper ORM?

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Да, это возможно. Я могу объяснить логику и то, как вы можете решить проблему, используя собственный базовый класс для приложения codeigniter.

Создайте файл внутри приложения / 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.

0 голосов
/ 20 октября 2011

Вы можете создать представление для таблицы, сопоставляя поля по своему усмотрению, а затем использовать представление в качестве своего класса ORM. Я использовал эту технику с Propel, где некоторые столбцы требовали подвыборов, которые были бы слишком сложными для поддержания обычного способа, и они действительно работали очень хорошо.

...