Sto sollevando un evento Yii su beforeSave del modello, che deve essere attivato solo se viene modificata una proprietà specifica del modello.Yii all'aggiornamento, rileva se una proprietà AR specifica è stata modificata su beforeSave()
L'unico modo in cui posso pensare a come farlo al momento è creando un nuovo oggetto AR e interrogando il DB per il vecchio modello usando il PK corrente, ma questo non è ottimizzato molto bene.
Ecco quello che ho in questo momento (si noti che il mio tavolo non dispone di un PK, è per questo che interrogo da tutti gli attributi, oltre a quello che sto paragonando contro - da qui la funzione unset
):
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();
}
Esiste un approccio migliore? Forse memorizzare le vecchie proprietà in una nuova proprietà locale in afterFind()
?
Questo è davvero l'unico modo "pulito" per farlo in Yii. Quello che ho fatto è stato implementare un ActiveRecord derivato che ha incorporato quella funzionalità e lo rende disponibile per tutti i miei modelli. Molto più facile che farlo di nuovo ogni volta. Ho anche dato metodi come "getIsChanged()" e "getChangedProperties()" e così via. – Blizz