with wherepivot updateorcreate meaning hasmany example php laravel eloquent

php - updateorcreate - wherepivot laravel



ActualizaciĆ³n elocuente de Laravel solo si se han realizado cambios (3)

Me gusta agregar este método, si está utilizando un formulario de edición, puede usar este código para guardar los cambios en su función de update(Request $request, $id) :

$post = Post::find($id); $post->fill($request->input())->save();

tenga en cuenta que debe nombrar sus entradas con el mismo nombre de columna. La función fill() hará todo el trabajo por ti :)

¿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 función de javascript 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 asegurarse 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 comprobando si el registro ha cambiado, pero antes de hacerlo de esa manera, me gustaría saber si el modelo elocuente de Laravel ya se ocupa 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();


Puede usar getChanges() en el modelo Eloquent incluso después de persistir.


Ya lo estas haciendo!

save() verificará si algo en el modelo ha cambiado. Si no lo tiene, 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 método getDirty() simplemente compara los atributos actuales con una copia guardada en el original cuando se crea el modelo. Esto se hace en el método syncOriginal() :

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 }