Я собираюсь использовать ORM DataMapper с CodeIgniter, но у меня есть сценарий, в котором структура базы данных сформирована плохо.
Я хотел бы иметь возможность настроить мою модель для сопоставления имен полей базы данных с чем-то более логичным. Затем, когда мы дойдем до обновления структуры базы данных, я могу просто обновить модель, и весь ссылочный код продолжит работать.
Возможно ли это с помощью DataMapper ORM?
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.
Вы можете создать представление для таблицы, сопоставив поля по своему усмотрению, а затем использовать представление в качестве вашего ORM-класса. Я использовал эту технику с Propel, где для некоторых столбцов требовались подзапросы, которые были бы слишком сложными, чтобы поддерживать их обычным способом, и это действительно работало очень хорошо.
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.