2010-12-09 3 views
1

Я создаю приложение, в котором пользователь может создать мета-поле для хранения данных в базе данных, эти поля будут получать разные виды данных, такие как даты или денежные значения.Yii model and custom fields

Моя первоначальная идея создания этого поля - хранить в таблице базы данных (например: meta_fields), имя, значение и валидацию этого поля.

После того, как вы использовали его в приложении, я намерен расширить методы AR __get и __set, чтобы использовать поле имени в качестве атрибута.

Пример:

Если на столе meta_fields у меня есть эти значения:

---------------------------------------------------- 
| id | name  | value  | validation   | 
---------------------------------------------------- 
| 1 | money_en | $562,00 | some validation... | 
---------------------------------------------------- 
| 2 | date_crt | 2010-12-09 | some validation... | 
---------------------------------------------------- 

я намерен использовать в своих взглядах и контроллеры вроде этого:

$model->money_en //will return $562,00 

Теперь вопросы :

1 - Как я могу использовать этот вид полей для хранения значений и восстановления его? 2 - Как я могу использовать различные виды проверки в этих полях? Так как я храню массив проверки как сериализованные значения в базе данных?

Спасибо.

ответ

3

Возможно, вам стоит взглянуть на реализацию EAV? Кто-то создал EAV-поведение для Yii в YiiExt, here (я его не использовал). EAV сложна и (часто) немного неэффективна (много объединений!), Но это путь, если вы хотите иметь произвольное число и тип полей, прикрепленных к строке «DB».

0

В основном, что вам нужно сделать, это настраиваемый базовый класс ActiveRecord. Если вы посмотрите на CActiveRecord, вы увидите, что он извлекает все виды метаинформации из выбранной вами базы данных. Поскольку в вашем случае метаинформация находится в таблице, вам нужно будет создать собственный базовый класс ActiveRecord, который обрабатывает то, что делает CActiveRecord.

Обратите внимание, что с помощью обычной таблицы метаданных, подобной той, которую вы описали выше, будет непросто выполнять обычные операции поиска и групп.

Не проще ли вам, если вы используете простую таблицу с идентификатором и значением, где значение содержит данные JSON?

------------------------------------------------------------------------- 
| ID | VALUE               | 
------------------------------------------------------------------------- 
| 10 | {'name':'validation','money_en':'$100','dare_crt' :'2010-12-09'} | 
------------------------------------------------------------------------- 

, а затем что-то вроде:

$record = MyTable::model()->findByPk(10); // or some thing like this 
$arr = CJSON::decode($record->VALUE); 
$arr['money_en'] == '$200'; 
$receord->VALUE = CJSON::encode($arr); 
$record->save(); 
+0

да, это отличная идея, но проблема с проверками. Я тоже думаю об этом, но я не могу найти одну идею для использования валидации здесь. – GodFather 2010-12-09 22:10:57

+0

Еще один момент, касающийся валидации, заключается в том, что целью является использование валидации модели yii. – GodFather 2010-12-09 22:16:54