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は複雑で、(多くの場合)少し非効率的です(多くの結合があります!)が、DBの「行」に任意の数とタイプのフィールドをアタッチしたい場合に最適です。

于 2010-12-14T17:50:06.590 に答える
0

基本的に、ここで達成する必要があるのは、カスタムActiveRecord基本クラスです。CActiveRecordを見ると、選択したデータベースからあらゆる種類のメタ情報が取得されていることがわかります。あなたの場合、メタ情報はテーブルにあるので、CActiveRecordが行うことを処理するカスタムActiveRecord基本クラスを作成する必要があります。

上記のようなカスタムメタテーブルでは、通常の検索やグループ化の操作を行うのは簡単ではないことに注意してください。

値にJSONデータが含まれている、IDと値を持つ単純なテーブルを使用する方が簡単ではないでしょうか。

-------------------------------------------------------------------------
| 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 に答える