Afertersave Y Beforesave

hola, estoy con un problema con el metado save().

preciso ejecutar uno UPDATE con este formato


UPDATE $table SET $setters WHERE $namePk IN($strIds)

Usando el metado save(), no pude hacer, entonces hice asi.




$sql = "UPDATE $table SET $setters WHERE $namePk IN($strIds)";

$this->success = Yii::app()->db->createCommand($sql)->execute() !== false;



Funciona el UPDATE, pero no llama los metados beforeSave ni el afterSave.

Saludos

Las funciones beforeSave y afterSave sólo se disparan si se usa ActiveRecord para hacer la gestión de los registros.

Ejemplo:




$registro = MiTabla::model()->findByPk($id);

$registro->campo1 = 'XXXX';

$registro->save(); // Acá se ejecutan los métodos beforeSave y afterSave



Espero le sea de utilidad.

Por lo que veo, creo que está haciendo actualización masiva de varios registros.

Dependiendo de las necesidades es más útil o práctico el uso de DAO (como ud lo está haciendo) o el uso de ActiveRecord (mi ejemplo).

Si necesita triggers, desea gestionar TODO desde PHP Y no le interesa el pequeño impacto en velocidad entonces la solución es sin duda ActiveRecord.

Pero si la velocidad es un aspecto MUY importante (la diferencia no es considerable en un sitio normal) y no necesita los triggers, entonces la salida es con DAO.

Espero que esto aclare las posibles dudas :)

Ah, sea dicho de paso que muy raras veces uso DAO en mis aplicaciones desarrolladas en Yii… casi siempre (por no decir siempre) usamos ActiveRecord…

Y también cabe mencionar que ActiveRecord usa internamente DAO para las consultas.

Saludos.

hola, si estoy usando un update all, con muchos registros, en algunos modulos mas de 20 mil registro, y la velocidad es fundamental, es mi 1º proyecto con yii, y en este update estoy bastante perdido.

siu me podes dar un ejemplo de como hacer este update usando ActiveRecord, estaría bárbaro.

Es muy importante que llame el metado afterSave

Saludos

Bueno la solución más simple sería algo así:




$registros = MiTabla::model()->findAll('campo1 IN (...) AND ...');

foreach($registros as $reg){

	$reg->campo2 = 'xxxx';

	$reg->save(false); // false aumenta un poco la velocidad saltando las validaciones en rules()



Saludos

voy hacer es usando filtro, o sea, solo permito updateall, si antes fue realizado un filtro.

Si no fue realizado el filtro, entonces limito en update para solo 100 registros. Si se intenta actualizar mas de 100 registro sin hacer una búsqueda, return false.

de esta forma puedo usar ActiveRecord sin perder velocidad,

Gracias

Interesante solución.

Nos cuenta cómo le fue :)

saludos a todos, y que tal si luego del :


public function actionUpdate($id)

	{

		

		$model=$this->loadModel($id);


if(isset($_POST['Persons']))

{

$audit="The user".Yii::app()->user->user_id." make the following updates... : ";

				foreach($model->attributes as $key => $value) 

				{

					

					if(isset($_POST['Persons'][$key]))

					{

					if($value!=$_POST['Persons'][$key])

					$audit.="[".$value. "] by . . [".$_POST['Persons'][$key]."],";

					}

				  

				}

}

if($valid)

			{

				

				

				

				

				

				

				

					if($model->save())

					{

}} . . . .