Consideraciones y buenas prácticas para eliminar datos

14/17

Lectura

Empiezo esta clase dándote una recomendación muy importante: utiliza la eliminación de registros solo cuando sea necesario y cuando estés totalmente seguro de que no va a tener ningún tipo de consecuencia a nivel de datos a futuro.

Esta recomendación la hago porque es muy importante conservar el histórico de datos, pues esto termina siendo información valiosa que en algún momento vas a necesitar. Lo recomendable para cuando necesites “desaparecer” información de manera visual es usar un campo que indique si el registro está activo o no (como el que usamos en projects de is_active) y simplemente ponerlo en 0 o 1 dependiendo el estado en que se encuentre, pero no lo eliminamos permanentemente de nuestra base de datos.

Ahora, si necesitamos eliminar registros de manera permanente, usaremos, por supuesto, nuestro modelo y una sintaxis muy similar a las anteriores operaciones que hemos realizado.

Del modo simple, solo tendremos que encontrar el registro por su Id y luego indicarle que lo elimine de esta forma:

$project = Project::find(1);
$project->delete();

Contamos realmente con varias formas de realizar esta acción, otra aún más simple es donde usamos el método destroy() (cuando tenemos la llave primaria de los registros que vamos a eliminar directamente) y lo podemos implementar de la siguiente manera:

Project::destroy(1);
Project::destroy(1, 2, 3);
Project::destroy([1, 2, 3]);

Como ves, podemos eliminar desde un registro hasta un grupo de registros de los cuales tengamos su llave primaria, estos datos se pueden enviar separados por comas o como un array (en caso de que lo recibamos de otro lado con este formato) y simplemente llamando a destroy().

Pero, aún así, tenemos otra opción para eliminar registros basado en múltiples condiciones en caso de que no tengamos un id o que deseemos eliminar un grupo de registros específicos:

Project::where('is_active', 0)->delete();

Esta sentencia utiliza nuevamente delete(), pero aquí la estamos implementando basados en una condición que sería a todos los proyectos que tengan el campo is_active en 0.

Como ves, a pesar de no ser la acción más recomendada, tenemos varias opciones para realizarlo de la manera más controlada posible.

Ahora hagamos una función que nos ayude a eliminar algunos registros de nuestra tabla projects, la llamaremos deleteProject y la agregaremos también a projectController.

public function deleteProject() {
    $project = Project::where('project_id', '>', 15)->delete();
    return "Registros eliminados";
}

Con esta función eliminaremos todos los proyectos cuyo project_id sea mayor a 15 y al final nos retornará un mensaje que diga “Registros eliminados”. ¡Vamos a probarla!

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

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

Limpiamos caché:

php artisan cache:clear

Iniciamos el servidor nuevamente:

php artisan serve

Vamos al navegador y escribimos en la barra de direcciones:

http://localhost:8000/deleteProject

Nos debe mostrar el mensaje que pusimos en el return de la función: “Registros eliminados”. Ya sabes que puedes verificar si se eliminaron los registros entrando a tu tabla a través de la consola de MySQL o consultando la función inicial que creamos que trae todos los registros de la tabla projects.

Reto 🏁

Ahora que sabes cómo eliminar registros de manera definitiva de tu base de datos, te reto a que crees tu propia función para eliminar los primeros 10 registros de la tabla projects.

Te invito a continuar con la próxima clase en la que aprenderás a optimizar las instrucciones y esto lo lograremos con Query Scopes. ➡

Aportes 16

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

como dice la profesora es importante conservar los datos otra opcion seria en las migraciones agregar el
$table->softDeletes();

    Schema::create('your_table', function (Blueprint $table) {
       	    ...
            $table->softDeletes();
        });

esto creara un campo deleted_at en la tabla y para que funcione aumentar en el modelo “Project” el use SoftDeletes;

De hecho la (buena) recomendación que hace la profe. sería una aplicación del Soft Deleting en Laravel, en donde básicamente a la tabla en cuestión se le agrega (vía migration preferiblemente) un campo llamado deleted_at, y se agrega al modelo el trait SoftDeletes (ver documentación). Esto es de gran utilidad, con lo cual se contribuye a la integridad de los datos.

Documentación: https://laravel.com/docs/7.x/eloquent#soft-deleting

reto cumplido
Route::get(‘deleteFirstTenProject’, ‘[email protected]’);

    public function deleteFirstTenProject()
    {
        $project = Project::take(10)->delete();
        return "Primeros 10 Registros eliminados";
    }

Efectivamente es muy fácil eliminar registros con Laravel xD Pero se menciona algo muy importante, y es que siempre debemos de tratar de mantener nuestros registros con un estado is_active, así no los eliminamos directamente y podemos mantenerlos un tiempo.

Me gusta mas utilizar el método findOrFail que find pues me permite lazar un 404 en caso de que no este en la DB el registro a eliminar y de esa forma evitarse uno el error que sale en pantalla.

<?php
public function deleteProject(){
	$project = Project::findOrFail(1);
  $project->delete();
}

Agradecimiento a los compañeros que recomendaron el uso de SoftDelete.

Muy importante y fácil su uso.

Adjunto documentación año 2021

https://laravel.com/docs/7.x/eloquent#soft-deleting

Porque no recomiendas utilizar el soft delete con el campo deleted_at que se puede implementar en Laravel?

Done!

Función deletefirstTenProjects

Ruta deletefirstTenProjects

Muy importante la recomendación de no eliminar información, ya que nos puede servir en el futuro para múltiples usos, como estadísticas y demás …

muy buena clase aprendí mucho.

public function deleteFirstTenProject() {
$project = Project::where(‘id’, ‘<=’, 10)->delete();
return “Registros eliminados”;
}

En laravel 8

public function deleteProject() {
            $project = Project::where('project_id', '<', 11)->delete();
            return "Registros eliminados";
        }
/**
     * Delete first 10 projects
     *
     */
    public function deleteFirstProject()
    {
        $projects = Project::where('id', '<=', 10)->delete();

        return "10 Primeros proyectos eliminados";
    }

public function destroy(): bool
{
return Project::where(‘project_id’, ‘>’, 15)->delete() ? true : false;
}

public function deleteProject() {
        // $project = Project::where('project_id', '>', 15)->delete();
        Project::take(10)->delete();
        return "Registros eliminados";
    }
}```

Sí, como menciona la profesora, es importante hacer un borrado lógico de nuestros datos (utilizando un campo is_active o deleted_at) manteniendolos en el tiempo, y que no permita consultar un histórico o verificar una acción pasada.