link - En CakePHP, ¿cómo se puede determinar si un campo fue cambiado en una acción de edición?
cakephp html link (6)
Estoy usando cacheCounter
en CakePHP
, que incrementa un contador para campos relacionados.
Ejemplo, tengo una tabla Persona una tabla 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
funciona bien cuando cambio el valor de una fuente en una persona. Incrementa Source.Person_Count
. Guay.
Pero cuando se incrementa, lo agrega a la fuente de destino de una persona, pero no lo elimina del valor anterior. Intenté updateCacheControl()
en afterSave
, pero eso no hizo nada.
Entonces escribí un código en mi modelo para afterSave
que restaría el source source_id, pero siempre lo hacía incluso cuando ni siquiera estaba cambiando el source_id
. (Entonces el recuento fue negativo).
Mi pregunta: ¿hay alguna manera de saber si un campo fue cambiado en el modelo en CakePHP
?
Con referencia a Alexander 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 también valor.
En la vista de edición, incluya otro campo oculto para el campo que desea monitorear, pero agregue un sufijo al nombre del campo con algo así 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 hacer la actualización no es gran cosa, por lo tanto, busque 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.
Para supervisar los cambios en un campo, puede usar esta lógica en su modelo sin necesidad de realizar cambios en otro lugar:
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;
}
Puedes llamar a getAffectedRows () en cualquier clase de modelo.
De 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();
}
Vea si el "guardar" utiliza algún tipo de llamada DBAL que devuelve "filas afectadas", por lo general, esta es la forma en que puede juzgar si la última consulta cambió los datos, o si no lo hizo. Porque si no lo hizo, las filas afectadas después de una instrucción UPDATE son 0.