Necesito verificar si se ha actualizado un modelo y qué atributos han cambiado al guardar.

Estoy usando dirtyattributes y filtrar intval como el Sugiere docs. Los valores vienen de una API y están lanzados de tipo a medida que entran, por lo que en teoría el filtro es redundante.

reglas modelo

public function rules()
{
    return [
        [['contract_date', 'order_date'], 'integer'],
        [['contract_date', 'order_date'], 'filter', 'filter' => 'intval'],
    ];
}

Este es alguno del código actualmente en ejecución:

// Add the changed status variables to the job log
$dirty_attributes = array_keys($model->dirtyAttributes);
if($model->save()) foreach ($dirty_attributes as $attribute)
{
    $data[$attribute] = $model->getOldAttribute($attribute).' ('.gettype($model->getOldAttribute($attribute)).')'. ' => '. $model->$attribute.' ('.gettype($model->$attribute).')';
}
var_dump($data);

esto produce:

["contract_date"]=>
string(44) "1559669638 (integer) => 1559669638 (integer)"
["order_date"]=>
string(44) "1559669638 (integer) => 1559669638 (integer)"

Probablemente haya algo obvio que me esté desaparecido, pero puedo entender qué.

0
Jørgen 1 jul. 2019 a las 20:39

1 respuesta

La mejor respuesta

Después de guardar el modelo, todos los "OldAtTributes" se actualizan para almacenar nuevos valores, por lo que los compararlos como usted no tiene sentido. Si desea verificar qué atributos se han cambiado después de guardar, puede anular el método afterSave() en su modelo como:

public function afterSave($insert, $changedAttributes)
{
    // $changedAttributes -> this is it
    parent::afterSave(); // call parent to trigger event
}

O escuche el evento ActiveRecord::EVENT_AFTER_INSERT / ActiveRecord::EVENT_AFTER_UPDATE / ActiveRecord::EVENT_AFTER_UPDATE donde también se pasan estos datos.

0
Bizley 1 jul. 2019 a las 19:13