1

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

我最初创建这个字段的想法是存储在一个数据库表中(例如: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 - 我怎样才能对这个字段使用不同的验证类型?因为我将验证数组作为序列化值存储在数据库中?

谢谢。

4

3 回答 3

3

也许您应该研究EAV实现?有人在 YiiExt 中为 Yii 创建了一个 EAV 行为,这里(我没用过)。EAV 很复杂,而且(通常)有点低效(很多连接!),但如果您想将任意数量和类型的字段附加到数据库“行”,这是可行的方法。

于 2010-12-14T17:50:06.590 回答
0

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

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

如果您使用带有 id 和 value 且 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();
于 2010-12-09T22:04:54.460 回答
0

看看这个扩展。它实现了您需要的配置文件字段。 http://www.yiiframework.com/extension/yii-user-management

于 2010-12-12T22:31:19.683 回答