Ich erhebe ein Yii-Ereignis auf beforeSave des Modells, das nur ausgelöst werden soll, wenn eine bestimmte Eigenschaft des Modells geändert wird.Yii bei der Aktualisierung, erkennen, ob eine bestimmte AR-Eigenschaft auf beforeSave() geändert wurde
Die einzige Möglichkeit, wie ich das jetzt machen kann, ist, ein neues AR-Objekt zu erstellen und die DB für das alte Modell mit dem aktuellen PK abzufragen, aber das ist nicht sehr gut optimiert.
Hier ist, was ich habe jetzt (beachten Sie, dass mein Tisch kein PK hat, deshalb habe ich von allen Attributen abfragen, außer der, die ich gegen bin im Vergleich - daher der unset
-Funktion):
public function beforeSave()
{
if(!$this->isNewRecord){ // only when a record is modified
$newAttributes = $this->attributes;
unset($newAttributes['level']);
$oldModel = self::model()->findByAttributes($newAttributes);
if($oldModel->level != $this->level)
// Raising event here
}
return parent::beforeSave();
}
Gibt es einen besseren Ansatz? Vielleicht speichern Sie die alten Eigenschaften in einer neuen lokalen Eigenschaft in afterFind()
?
Dies ist in der Tat die einzige "sauber", wie es in Yü zu tun. Was ich getan habe, war eine abgeleitete ActiveRecord zu implementieren, die diese Funktionalität eingebaut hat und sie für alle meine Modelle verfügbar macht. Viel einfacher als es jedes Mal wieder zu tun. Ich gab auch Methoden wie "getIsChanged()" und "getChangedProperties()" und so weiter. – Blizz