En CakePHP, ¿cómo se puede determinar si un campo se cambió en una acción de edición?

StackOverflow https://stackoverflow.com/questions/115665

  •  02-07-2019
  •  | 
  •  

Pregunta

estoy usando el cacheCounter en CakePHP, que incrementa un contador para campos relacionados.

Por ejemplo, tengo una tabla de Persona y una tabla de Fuente.Person.source_id se asigna a una fila en la tabla Fuente.Cada persona tiene una Fuente y cada Fuente tiene ninguna o muchas filas de Persona.

cacheCounter Está funcionando muy bien cuando cambio el valor de una fuente en una persona.Se incrementa Source.Person_Count.Fresco.

Pero cuando aumenta, lo agrega a la fuente de destino de una persona, pero no lo elimina del valor anterior.Lo intenté updateCacheControl() en afterSave, pero eso no hizo nada.

Entonces escribí algo de código en mi modelo para afterSave eso restaría la fuente source_id, pero siempre hacía esto incluso cuando ni siquiera estaba cambiando el source_id.(Entonces el conteo salió negativo).

Mi pregunta:¿Hay alguna manera de saber si se cambió un campo en el modelo en CakePHP?

¿Fue útil?

Solución

Para monitorear los cambios en un campo, puede usar esta lógica en su modelo sin que se requieran cambios en otros lugares:

function beforeSave() {
    $this->recursive = -1;
    $this->old = $this->find(array($this->primaryKey => $this->id));
    if ($this->old){
        $changed_fields = array();
        foreach ($this->data[$this->alias] as $key =>$value) {
            if ($this->old[$this->alias][$key] != $value) {
                $changed_fields[] = $key;
            }
        }
    }
    // $changed_fields is an array of fields that changed
    return true;
}

Otros consejos

Con referencia a Alejandro Morland Respuesta.

¿Qué tal esto en lugar de recorrerlo antes del filtro?

$result = array_diff_assoc($this->old[$this->alias],$this->data[$this->alias]);

Obtendrá clave y valor también.

En la vista de edición, incluya otro campo oculto para el campo que desea monitorear, pero agregue al nombre del campo un sufijo como "_prev" y establezca el valor en el valor actual del campo que desea monitorear.Luego, en la acción de edición de su controlador, haga algo si los dos campos no son iguales.p.ej.

echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));

Las ediciones ocurren con poca frecuencia, por lo que otra selección antes de realizar la actualización no es gran cosa, por lo tanto, obtenga el registro antes de guardarlo, guárdelo, compare los datos enviados en el formulario de edición con los datos que obtuvo de la base de datos antes de guardarlo. Si es diferente, haz algo.

Vea si "guardar" usa algún tipo de llamada DBAL que devuelve "filas afectadas", generalmente así es como puede juzgar si la última consulta cambió los datos o si no.Porque si no fuera así, las filas afectadas después de una declaración de ACTUALIZACIÓN son 0.

Puede llamar a getAffectedRows() en cualquier clase de modelo.

De la clase Modelo:

/**
 * Returns the number of rows affected by the last query
 *
 * @return int Number of rows
 * @access public
 */
    function getAffectedRows() {
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        return $db->lastAffected();
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top