Llevo tiempo trabajando con yii, y ahora me he embarcado en un proyecto nuevo utilizando lo. Mi duda es la siguiente:
Hay alguna manera que en el momento de guardar un modelo se genere un histórico?(guardado debidamente en una tabla histórica de este modelo). Hasta ahora lo he hecho a "mano" ya que cada vez que realizaba un save de modelo, tambien generaba un histórico de este y lo guardaba. Lo que busco es algo más dinámico, algo del estilo de los "behavior" para realizar esa tarea automáticamente después de guardar un registro.
Si es lo que yo realizaba, pero me parecía muy tedioso tener que estar a crear el objeto cada ves que quería realizar un volcado.
Pues dando le vueltas al tema conseguí esto:
private $model_H;
public function beforeSave()
{
if($this->isNewRecord === false && $this->validate() === true)
{
$model_Old = $this->findByPk($this->ID_Usuario);
if($model_Old != null)
{
//pasamos los parametros a la variable global
$this->model_H = new UsuariosHistorico;
$this->model_H->attributes = $model_Old->attributes;
$this->model_H->ID_Usu = Yii::app()->user->getState('ID_Usuario');
$this->model_H->Tipo_Gest = "A";
if($this->validate()===false)
{
$this->model_H = null;
}
}
}
return parent::beforeSave();
}
public function afterSave()
{
if($this->isNewRecord === false && $this->validate() === true && $this->model_H != null)
{
$this->model_H->save();
$this->model_H = null;
}
return parent::afterSave();
}
Esto lo realizo en el modelo de una de mis tablas. Creo una variable global, en la que después de verificar que se trata de una actualización y no de una inserción, guardo el registro que se va a modificar de la base de datos en la variable $this->model_H antes de realizar el "save"(función beforeSave). Y luego de que se realice la actualización vuelvo a hacer unas comprobaciones y guardo el registro anterior en la tabla histórica y dejo la variable a null.
De esta manera tan solo tengo que llamar al "save" del modelo y el se encargara de guardar en las dos tablas siempre, y sin tener que crear yo el objeto antes.