2010-12-09 108 views
1

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

我最初的想法是创建这个字段是存储在数据库表(例如: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的实现?有人在YiiExt中创建了Yii的EAV行为,here(我还没有用过)。 EAV是复杂的,并且(通常)效率低下(大量联接!),但是如果您想要将任意数量和类型的字段附加到数据库“行”,则这是一种行之有效的方法。

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(); 
+0

是的,它是一个好主意,但验证问题。我也考虑过,但我无法找到一个想法来在此处使用验证。 – GodFather 2010-12-09 22:10:57

+0

关于验证的另一点是,其目的是使用yii模型验证。 – GodFather 2010-12-09 22:16:54

相关问题