2010-12-09 96 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

相關問題