Actualizando registros de la base de datos

13/17

Lectura

Así como hemos agregado nuevos registros a nuestra base de datos haciendo uso de modelos, podemos modificar o actualizar registros de una manera muy similar e igual de sencillo.

La estructura es básicamente la misma, sin embargo, tenemos una variante, que es encontrar el registro que vamos a modificar para poder cambiar un valor de algún campo:

$project = Project::find(1);
$project->name = 'Nuevo nombre para el proyecto de Id 1';
$project->save();

Lo que hicimos fue buscar primero el proyecto, al cual le haremos la modificación a través de su llave primaria que hemos definido en el modelo Project, sobre ese objeto realizamos la asignación del nuevo valor en este caso a la columna name y luego llamamos el método save() que, a su vez, actualizará automáticamente el campo updated_at por la fecha/hora actual que corresponde a cuando hacemos un cambio en un registro.

Vamos a nuestro ProjectController y crearemos una función llamada updateProject donde agregaremos el siguiente contenido:

public function updateProject() {
    $project = Project::find(2);
    $project->name = 'Proyecto de tecnología';
    $project->save();

    return "Actualizado";
}

En esta función estamos buscando primero el proyecto con project_id igual a 2 y luego le asignamos un nuevo nombre Proyecto de tecnología, la llave primaria ya la configuramos al principio cuando creamos el modelo, por eso ahora no necesitamos indicarle más que el valor y ya la encontrará usando el método find().

¡Veamos cómo funciona!

Agregamos la ruta de esta función a nuestro archivo de rutas web.php:

Route::get('updateProject', '[email protected]');

Limpiemos caché desde la consola:

php artisan cache:clear

Iniciamos el servidor nuevamente:

php artisan serve

Vamos al navegador y escribimos en la barra de direcciones:

http://localhost:8000/updateProject

Si todo salió bien, nos mostrará el mensaje que pusimos en el return de la función ( “Actualizado”). Nuevamente, podemos ejecutar la ruta de la función que nos lista todos nuestros registros. Veamos el registro de project_id igual a 1 para comprobar si ahora tenemos el nombre del proyecto que le modificamos desde acá.

Actualizar registros por condiciones específicas ☝🏼

Podemos actualizar registros en bloques que cumplan condiciones específicas de acuerdo a sus campos en la base de datos, por ejemplo, si quisiéramos actualizar la fecha de ejecución de todos los proyectos que estén activos y que además tengan el id de ciudad igual a 4, tendríamos algo así:

Project::where('is_active', 1)
    ->where('city_id', 4)
    ->update(['execution_date' => '2020-02-03']);

Teniendo en cuenta que el método update solo recibe un array, si fuéramos a actualizar más de un campo bajo esta misma condición solo bastaría con separarlo por una coma.

Reto 🏁

Ahora ya puedes actualizar o modificar registros en tu base de datos, ahora te reto a que cambies el nombre de todos los proyectos inactivos en la tabla de projects.

En la próxima clase aprenderemos a eliminar registros de forma permanente en nuestra base de datos y los diferentes métodos que podemos usar para hacerlo responsablemente.

Aportes 11

Preguntas 0

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Genial! El método update es muy util cuando quieres hacer un update sencillo sin tener que ir a buscar el registro y guardarlo en una variable y luego hacerle los cambios y luego guardarlos, usando ->update() podemos hacerlo de una forma más rápida y sencilla 😄

Reto superado ![](

Done!
Función de renombre de proyectos

Ruta de renombre de proyectos inactivos

Antes de la tabla projects

Después de ejecutar función

Así queda el método si deseamos actualizar desde un formulario:

public function updateProject(Request $request, $id) {
    $project = Project::findOrFail($id);;
    $project->city_id = $request->cityId;
    $project->company_id = $request->companyId;
    $project->user_id = $request->userId;
    $project->name = $request->name;
    $project->execution_date = $request->executionDate;
    $project->is_active = $request->isActive;
    $project->save();

    return "Actualizado";
}

Mi ruta

Route::get('inactivatedProject', '[email protected]');

Mi función:

public function inactiveProject()
    {
        Project::where('is_active', 0)
        ->update(['name' => 'I am desactivated']);

        return "Actualizado";
    }

😄

reto completado

Reto completado!

Realizado!

Reto cumplido

En ProjectController escribimos la función. En este caso le agregué una variable para que me contabilice los proyectos inactivos que se actualizaron. Si no encuentra un proyecto inactivo, lanzará otro mensaje, aunque no tengo la certeza de que si se podría acortar la consulta o integrarla a la misma variable $project:

     public function updateInactiveProjects() {
            $project = Project::where('is_active', 0)
                ->update(['name' => 'Proyecto Inactivo']);
            
            $count = Project::where('is_active', 0)->count();

                if($count == 0){

                    return "No hay proyectos por actualizar";
                } else {

                    return "Se han actualizado $count proyectos inactivos";
                }
    
        } 

Luego configurar la ruta:

Route::get('updateInactive', '[email protected]');

Y el resultado final:

Se han actualizado 5 proyectos inactivos

Favor de entregarme feedback. Gracias.

El reto lo conseguí de la siguiente manera:

  • Primero actualice algunos proyectos desde la base de datos con el campo ‘is_active’ = 0.

  • Luego realice la siguiente función:

    public function updateInactiveProjects() {
        $project = Project::where('is_active', 0)
            ->update(['name' => 'Proyecto Inactivo']);

            return "Se han actualizado los proyectos inactivos";
    } 

😉 😉 😉