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

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

Возможно ли это с помощью DataMapper ORM?

3
mattdwen 2 Май 2011 в 03:09
Можете ли вы привести несколько примеров - какая у вас сейчас плохая структура? Какие изменения вы хотите внести в сущности ORM?
 – 
Ilia Kondrashov
18 Окт 2011 в 12:03

2 ответа

Лучший ответ

Да, это возможно. Я могу объяснить логику и то, как вы можете решить проблему, используя собственный базовый класс для приложения 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.

1
Raftalks 21 Окт 2011 в 06:34

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

0
halfer 20 Окт 2011 в 09:28