2010-12-09 17 views
1

Ich erstelle eine App, wo Benutzer kann Meta-Feld erstellen, um Daten in der Datenbank zu speichern, diese Felder erhalten verschiedene Arten von Daten, wie Daten oder monetäre Werte.Yii Modell und benutzerdefinierte Felder

Meine erste Idee, diese Felder zu erstellen, ist in einer Datenbanktabelle (zB: meta_fields) gespeichert, der Name, Wert und Validierungen dieses Feldes.

Nach der Zeit der Verwendung es auf App, ich beabsichtige, die AR-Methoden __get und __set zu erweitern, um das Namensfeld als Attribut zu verwenden.

Beispiel:

Wenn auf meinem Tisch meta_fields Ich habe diese Werte:

---------------------------------------------------- 
| id | name  | value  | validation   | 
---------------------------------------------------- 
| 1 | money_en | $562,00 | some validation... | 
---------------------------------------------------- 
| 2 | date_crt | 2010-12-09 | some validation... | 
---------------------------------------------------- 

ich in meinen Ansichten und Controller wie sie verwendet werden sollen:

$model->money_en //will return $562,00 

Nun die Fragen sind :

1 - Wie kann ich diese Art von Feldern verwenden, um Werte zu speichern und wiederherzustellen? 2 - Wie kann ich verschiedene Validierungsarten für diese Felder verwenden? Seit ich das Validierungsarray als serialisierte Werte auf der Datenbank speichere?

Danke.

Antwort

3

Vielleicht sollten Sie in eine EAV Implementierung schauen? Jemand hat im YiiExt, here, ein EAV-Verhalten für Yii erstellt (ich habe es nicht benutzt). EAV ist kompliziert und (oft) ein wenig ineffizient (viele Joins!), Aber es ist der Weg zu gehen, wenn Sie eine beliebige Anzahl und Art von Feldern haben möchten, die an eine DB "Zeile" angehängt sind.

+0

Ich brauche ein wenig mehr darüber, weil ich es vorher noch nie benutzt habe. – GodFather

+0

Sie könnten dem EAV-Verhalten zusätzlichen Code hinzufügen, um die Validierung zu verarbeiten. Das Verhalten behandelt jetzt nur das Abrufen und Einstellen, aber ein wenig Ellenbogenfett könnte eine validateEavAttributes() -Methode hinzufügen, die Sie in Ihrem Modell vorValidate aufrufen könnten. Es scheint leider nicht, dass es eine fertige Lösung für Sie gibt, aber das könnte definitiv funktionieren. – thaddeusmt

0

Grundsätzlich ist hier eine benutzerdefinierte ActiveRecord-Basisklasse erforderlich. Wenn Sie sich CActiveRecord ansehen, werden Sie feststellen, dass es alle Arten von Metainformationen aus Ihrer bevorzugten Datenbank abruft. Da in Ihrem Fall die Meta-Informationen in einer Tabelle enthalten sind, müssen Sie eine benutzerdefinierte ActiveRecord-Basisklasse erstellen, die CActiveRecord verarbeitet.

Beachten Sie, dass es bei einer benutzerdefinierten Metatabelle wie der oben beschriebenen nicht einfach ist, normale Such- und Gruppenoperationen durchzuführen.

Wäre es nicht einfacher für Sie, wenn Sie eine einfache Tabelle mit ID und Wert verwenden, wo der Wert JSON-Daten enthält?

------------------------------------------------------------------------- 
| ID | VALUE               | 
------------------------------------------------------------------------- 
| 10 | {'name':'validation','money_en':'$100','dare_crt' :'2010-12-09'} | 
------------------------------------------------------------------------- 

und dann so etwas wie:

$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

Ja, es ist eine großartige Idee, aber das Problem mit den Validierungen. Ich denke darüber nach, aber ich kann hier keine Idee finden, die Validierung zu verwenden. – GodFather

+0

Ein anderer Punkt über Validierungen ist, dass die Absicht ist, yii Modellvalidierungen zu verwenden. – GodFather

+0

Denken Sie daran, dass Ihnen eine sehr wichtige Sache fehlt, wenn Sie serialisierte (json-ed) Werte verwenden - Sie können sie nicht mit Standard-SQL durchsuchen. – galymzhan

Verwandte Themen