¿Hay alguna forma de actualizar un registro en Laravel usando modelos elocuentes solo si se ha realizado un cambio en ese registro? No quiero que ningún usuario solicite la base de datos sin una buena razón una y otra vez, simplemente presionando el botón para guardar los cambios. Tengo una javascript
función que habilita y deshabilita el botón de guardar según si algo ha cambiado en la página, pero me gustaría saber si es posible asegurarme de hacer este tipo de función también en el lado del servidor. Sé que puedo lograrlo por mí mismo (es decir: sin apelar a una funcionalidad interna del marco) simplemente verificando si el registro ha cambiado, pero antes de hacerlo de esa manera, me gustaría saber si el modelo elocuente de Laravel ya se encarga de eso, así que no necesito reinventar la rueda.
Esta es la forma en que uso para actualizar un registro:
$product = Product::find($data["id"]);
$product->title = $data["title"];
$product->description = $data["description"];
$product->price = $data["price"];
//etc (string values were previously sanitized for xss attacks)
$product->save();
dirty
bandera que se usa para determinar si realmente se requiere una actualización en la base de datos, y esta bandera se establece comparando losfind
valores de columna originales con los valores en el punto donde ejecuta el guardadoRespuestas:
¡Ya lo estás haciendo!
save()
Verificará si algo en el modelo ha cambiado. Si no es así, no ejecutará una consulta db.Aquí está la parte relevante del código en
Illuminate\Database\Eloquent\Model@performUpdate
:protected function performUpdate(Builder $query, array $options = []) { $dirty = $this->getDirty(); if (count($dirty) > 0) { // runs update query } return true; }
El
getDirty()
método simplemente compara los atributos actuales con una copia guardadaoriginal
cuando se crea el modelo. Esto se hace en elsyncOriginal()
método:public function __construct(array $attributes = array()) { $this->bootIfNotBooted(); $this->syncOriginal(); $this->fill($attributes); } public function syncOriginal() { $this->original = $this->attributes; return $this; }
Si desea verificar si el modelo está sucio, simplemente llame a
isDirty()
:if($product->isDirty()){ // changes have been made }
O si desea verificar un determinado atributo:
if($product->isDirty('price')){ // price has changed }
fuente
isDirty()
para eso. Vea la respuesta actualizadaisDirty()
.getChanges()
método. Verifique mi respuesta stackoverflow.com/a/54132163/1090395isDirty()
lo serátrue
si no lanzas bien tus atributos. Tenía un flotador que era exactamente el mismo que en la base de datos, sin embargo, debido a que estaba configurando el flotador con una cadena (ejemplo "10.50" en lugar de 10.50), lo detectaría como un cambio y realizaría una actualización.Puede usar
getChanges()
en el modelo Eloquent incluso después de persistir.fuente
Me gusta agregar este método, si está usando un formulario de edición, puede usar este código para guardar los cambios en su
update(Request $request, $id)
función:tenga en cuenta que debe nombrar sus entradas con el mismo nombre de columna. La
fill()
función hará todo el trabajo por ti :)fuente
fill
y cómo enviarle una solicitud en masa. ¡Gracias! Sin embargo, no necesitaba pasar la identificación, ya que estoy actualizando, por lo que ya está allí$request->id
.