Yii模型和自定义字段

时间:2010-12-09 21:34:25

标签: yii custom-attributes custom-fields

我正在创建一个应用程序,用户可以在其中创建元数据来存储数据库中的数据,这些字段将接收不同类型的数据,如日期或货币值。

我最初创建此字段的想法是存储在数据库表(例如:meta_fields)中,该字段的名称,值和验证。

在应用程序上使用它之后,我打算扩展AR方法__get和__set以使用name字段作为属性。

示例:

如果在我的桌子上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 个答案:

答案 0 :(得分:3)

也许您应该研究EAV实施?有人在YiiExt中为Yii创建了一个EAV行为,here(我没有使用它)。 EAV很复杂,而且(通常)效率很低(很多连接!),但是如果你想将一个任意数量和类型的字段附加到DB“行”,那么它就是要走的路。

答案 1 :(得分:0)

基本上你需要在这里完成的是一个自定义的ActiveRecord基类。如果您查看CActiveRecord,您将看到它从您选择的数据库中检索所有类型的元信息。因为在您的情况下,元信息在表中,您需要创建一个自定义ActiveRecord基类来处理CActiveRecord所做的事情。

请注意,使用上面描述的自定义元表将不容易进行常规搜索和组操作。

如果您使用带有id和value的简单表,其中值包含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();

答案 2 :(得分:0)

看一下这个扩展名。它实现了您对配置文件字段所需的内容。 http://www.yiiframework.com/extension/yii-user-management