Маппинг ActiveRecord/attribute -> Table/Field

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Caveman » 2010.08.20, 07:00

Столкнулся с необходимостью наличия маппинга, которой сейчас нету.
Очень необходимая вещь (ибо не хочется иметь поля типа ProductAttributeID).
Пока что написал собственную простейшую реализацию с некоторыми недостатками.
Для нормальной работы встроенных виджетов (например, CGridView), пришлось некоторые классы переопределять (вплоть до CSort), что в принципе очень нежелательно.
Если хотя бы сейчас не озаботиться реализацией данной функции, то в дальнейшем это может быть еще более накладно.

В общем, очень хочется иметь встроенную функцию маппинга!

Аватара пользователя
slavcodev
Сообщения: 3133
Зарегистрирован: 2009.04.02, 21:42
Откуда: Altea, Spain
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение slavcodev » 2010.08.20, 07:49

Использовать гетеры и сетеры не спасает?

Код: Выделить всё

public function getProduct_attribute_id()
{
   return $this->productAttributeID;
} 
Жду Yii 3!

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Ekstazi » 2010.08.20, 09:06

У меня было, но, неэффективным оказалось и я стер код. Примерно так:

Код: Выделить всё

protected $_mapped=array(
'attr1'=>'attr2',
//....
);
public function __get($attr)
{
if(in_array($attr,$this->_mapped)){
$attr=$this->_mapped[$attr];
}
return parent::__get($attr);
}

public function __set($attr,$val)
{
if(in_array($attr,$this->_mapped)){
$attr=$this->_mapped[$attr];
}
return parent::__set($attr);
} 
Как-то так.

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Caveman » 2010.08.20, 09:14

Ekstazi писал(а):У меня было, но, неэффективным оказалось и я стер код....
Как-то так.
Ну вот как-то так.
Хочется универсального решения, в котором карта задается простым массивом.

Еще есть проблема, при которой требуется получать флипнутый массив (column -> attribute), в CGridView как раз столкнулся с этим.

Аватара пользователя
samdark
Администратор
Сообщения: 9202
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение samdark » 2010.08.20, 12:02

Кажется, вот тут обсуждают примерно то же: http://www.yiiframework.com/forum/index ... l-binders/

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Caveman » 2010.08.20, 13:35

Sam Dark писал(а):Кажется, вот тут обсуждают примерно то же: http://www.yiiframework.com/forum/index ... l-binders/
Особо не вчитывался, но, по-моему, это не то.
Я имею ввиду ORM маппинг (неправильно, конечно, называю...), например:

Код: Выделить всё

array(
        'id' => 'Element_ID',
        'page_id' => 'Page_ID',
        'type' => 'Element_Type',
        'content' => 'Element_Content',
        'default' => 'Element_Default'
    ); 
Тут ключи - свойства объекта данного типа (Element), а значения - имена столбцов в соответствующей таблице.

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

Код: Выделить всё

$el = Element::model()->find(array(
            'select' => 'Element_Content',
            'condition' => 'Element_ID=:id',
            'params' => array(':id'=>2)
        )); 
Тут получается, что все равно вынуждены использовать имена столбцов.
Сейчас я сделал так:

Код: Выделить всё

$el = Element::model()->find(array(
            'select' => Element::MAP('content'),
            'condition' => Element::MAP('id').'=:id',
            'params' => array(':id'=>2)
        )); 
Наверное, было бы хорошо что-нибудь типа:

Код: Выделить всё

$el = Element::model()->find(array(
            'select' => '[[content]]',
            'condition' => '[[id]]=:id',
            'params' => array(':id'=>2)
        )); 
Хотя и тут есть проблема - в критерии могут участвовать несколько AR, соответственно, необходимо еще указывать, свойство какого класса надо отрезолвить в имя столбца:

Код: Выделить всё

$el = Element::model()->find(array(
            'select' => '[[Element.content]]',
            'condition' => '[[Element.id]]=:id',
            'params' => array(':id'=>2)
        )); 
Hibernate: http://docs.jboss.org/hibernate/stable/ ... appinguser

Аватара пользователя
samdark
Администратор
Сообщения: 9202
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение samdark » 2010.08.20, 17:28

Я Qiang-у в своё время предлагал абстрагировать ещё и запросы, но ему идея не понравилась. Быть может в Yii2…

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Caveman » 2010.08.20, 21:07

Эх, будем ждать :)

А то мне нечего сказать на фразу "Вот в дотнет и яве есть маппинг, а в вашем пхп нету" ))

Аватара пользователя
samdark
Администратор
Сообщения: 9202
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение samdark » 2010.08.20, 22:54

Да есть и в PHP маппинг. В том же Propel вроде был, но там мапить замучаешься.

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Caveman » 2010.08.21, 00:07

Да есть-то есть, но зачем подключать стороннюю библиотеку ORM, когда очень удобная встроенная есть.

Аватара пользователя
samdark
Администратор
Сообщения: 9202
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение samdark » 2010.08.21, 00:24

Я про «а в вашем пхп нету» :) Встроена у нас не ORM, а AR.

woooo
Сообщения: 1
Зарегистрирован: 2012.11.08, 00:06

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение woooo » 2012.11.08, 00:11

Код: Выделить всё

    array(
            'id' => 'Element_ID',
            'page_id' => 'Page_ID',
            'type' => 'Element_Type',
            'content' => 'Element_Content',
            'default' => 'Element_Default'
        ); 
Тут ключи - свойства объекта данного типа (Element), а значения - имена столбцов в соответствующей таблице.
На дворе конец 2012 года
А сейчас такой маппинг есть?

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Маппинг ActiveRecord/attribute -> Table/Field

Сообщение Caveman » 2012.11.08, 12:29

woooo писал(а): На дворе конец 2012 года
А сейчас такой маппинг есть?
Версия Yii как была 1 так и осталась...
Так что ждем, что будет в Yii2

Ответить