Registro de actualización elocuente de Laravel sin cargar desde la base de datos

3 minutos de lectura

Soy bastante nuevo en laravel y estoy tratando de actualizar un registro desde la entrada del formulario. Sin embargo, veo que para actualizar el registro, primero debe obtener el registro de la base de datos. No es posible algo como actualizar un registro (la clave principal está configurada):

$post = new Post();
$post->id = 3; //already exists in database.
$post->title = "Updated title";
$post->save();

Post::where('id',3)->update(['title'=>'Updated title']);

  • Confirmado, esta es la forma Elocuente de actualizar sin realizar una búsqueda

    – Andy Blanco

    19 mayo 2018 a las 20:53

  • Desearía que esta respuesta se mostrara primero, ya que es la respuesta correcta: use Eloquent, no Query Builder.

    – Trevor

    8 de febrero de 2019 a las 5:25

  • ¿Esto se revierte si algo sale mal? Quiero decir, ¿esto está respaldado por DB::beginTransaction() ?

    – Jonatán Lavado

    17 de febrero de 2020 a las 20:43

  • por supuesto que funciona con un DB::beginTransaction() ya que es una sentencia que modifica la tabla, y el motor de la base de datos la interpretará como una transacción real.

    – Jeison Florez

    17 de abril de 2020 a las 13:19

  • @Kajasb ¿Hay alguno para obtener este registro actualizado sin una nueva consulta?

    – Assad Yaqoob

    27 de agosto de 2021 a las 6:51


Simplemente puede usar Query Builder en lugar de Eloquent, este código actualiza directamente sus datos en la base de datos 🙂 Esta es una muestra:

DB::table('post')
            ->where('id', 3)
            ->update(['title' => "Updated Title"]);

Puedes consultar la documentación aquí para más información: http://laravel.com/docs/5.0/queries#updates

  • Un millón de gracias. Me alegraste el día.

    – Amanjot Kaur

    19 de julio de 2016 a las 9:03

  • no porque entonces pierdes tus marcas de tiempo y otros comportamientos del modelo

    – Malhal

    4 oct 2016 a las 16:08

  • @malhal desafortunadamente, no he encontrado ninguna solución para este caso arreglado usando Eloquent, porque Eloquent básicamente crea objetos para que cada fila pueda tener todas esas características. por lo tanto, actualizarlos sin cargar y actualizar cada fila es simplemente imposible. CMIIW

    -Bagaskara Wisnu Gunawan

    5 de octubre de 2016 a las 5:08

  • ¿Cómo verifica, en este caso, si la fila dada se actualizó de hecho? Como un if ($data->save())?

    – Patros

    22 de marzo de 2017 a las 21:36

  • @malhal vea la respuesta a continuación de KaJasB para cualquiera que quiera usar elocuente para la actualización.

    -Bagaskara Wisnu Gunawan

    17 de mayo de 2018 a las 5:37

avatar de usuario
harrrrrr

Usar propiedad exists:

$post = new Post();
$post->exists = true;
$post->id = 3; //already exists in database.
$post->title = "Updated title";
$post->save();

Aquí está la documentación de la API: http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Model.html

  • Honestamente, esto es un poco difícil de leer.

    – Teoría de campo bajo

    11 de agosto de 2021 a las 21:36

avatar de usuario
maztch

La forma común es cargar la fila para actualizar:

$post = Post::find($id);

En tu caso

$post = Post::find(3);
$post->title = "Updated title";
$post->save();

Pero en un paso (solo actualice) puede hacer esto:

$affectedRows = Post::where("id", 3)->update(["title" => "Updated title"]);

También puedes usar firstOrCreate O firstOrNew

// Retrieve the Post by the attributes, or create it if it doesn't exist...
$post = Post::firstOrCreate(['id' => 3]);
// OR
// Retrieve the Post by the attributes, or instantiate a new instance...
$post = Post::firstOrNew(['id' => 3]); 

// update record
$post->title = "Updated title";
$post->save();

Espero que te ayude 🙂

¿Ha sido útil esta solución?