En este tutorial, te guiaré paso a paso a través del proceso de eliminación de notas usando formularios en Laravel. Aprenderás cómo enlazar un formulario con una ruta de tipo DELETE, y cómo manejar la eliminación de notas de forma eficaz y segura. También aprenderás que es el eliminado lógico y cómo puedes sacarle provecho para mantener un respaldo de todos los registros de tu aplicación, incluyendo aquellos que han sido eliminados por el usuario.

Mira el código en GitHub: actual, resultado, comparación.

Formulario y ruta para eliminar notas en Laravel 10 o superior

Podemos declarar una ruta para eliminar registros de la siguiente forma:

<?php

Route::delete('/notas/{id}', [NoteController::class, 'destroy'])->name('notes.destroy');

Debemos declarar el formulario como POST y hacer uso de la directiva @method de Laravel para obtener el campo oculto _method con el valor DELETE y de esta manera indicarle al framework que queremos que la petición sea de tipo DELETE en vez de POST. Esto es debido a que los navegadores solo soportan los métodos GET y POST:

<form method="POST" action="{{ route('notes.destroy', $note) }}">
    @method('DELETE')
    @csrf

    <!-- resto de nuestro formulario -->
</form>

Además, debemos recordar pasar el campo oculto para protección contra ataques de tipo CSRF, por ejemplo haciendo uso de la directiva @csrf.

Obtener y eliminar registros con Laravel

Para eliminar registros simplemente debemos llamar al método delete desde nuestro modelo de Eloquent:

$note = Note::findOrFail($id);

$note->delete();

Esto eliminará el registro de la base de datos.

Eliminado lógico con Eloquent

Eloquent nos brinda la característica de Soft Delete o Eliminado Lógico para ayudarnos a prevenir la pérdida de datos. Esto funciona de forma similar a una papelera de reciclaje donde los registros no son eliminados por completo sino que pueden recuperarse de diversas formas.

Para usar eliminado lógico, debemos agregar una columna extra a la tabla. Podemos lograr esto modificando la migración create_notes_table puesto que aún no hemos lanzado nuestra aplicación a producción:

<?php

//...

class CreateNotesTable extends Migration
{
    public function up()
    {
        Schema::create('notes', function (Blueprint $table) {
            //... Otras columnas aqui ...

            $table->softDeletes();
        });
    }

    //...
}

Re-ejecuta php artisan migrate:fresh --seed para obtener una nueva base de datos con esta columna.

Vamos a agregar el trait SoftDeletes a nuestro modelo de esta forma:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Note extends Model
{
    use SoftDeletes;
    
    //...
}

A partir de ahora, cuando elimines un registro, éste desaparecerá del listado por defecto, pero aún estará presente en la base de datos. Laravel conoce cuales registros están borrados y cuales no a través de la columna deleted_at. Esta columna almacena la fecha y hora en la cual un registro fue eliminado, si el valor es null quiere decir que el registro no ha sido eliminado o ha sido recuperado.

Si quieres aprender con detalle cómo crear una papelera de reciclaje con Laravel y Eloquent puedes darle un vistazo a mi lección premium: Crea una papelera en Laravel usando Soft Deletes de Eloquent ORM.

Eliminación de registros con el constructor de consultas de Laravel

Puedes ver cómo Eloquent primero obtiene la nota de la base de datos antes de eliminarla.

Podemos eliminar uno o varios registros en un solo paso utilizando el Facade DB.

<?php

use Illuminate\Support\Facades\DB;

DB::table('notes')->where('id', $id)->delete();

Esto nos ofrece la flexibilidad de eliminar varios registros al mismo tiempo o eliminar registros utilizando consultas complejas. Ten en cuenta que si utilizas el constructor de consultas directamente no funcionará el eliminado lógico y otras características que incluye Laravel.

Si solo queremos eliminar un registro podemos hacer uso de una sintaxis mucho más corta:

DB::table('notes')->delete($id);

Cuando trabajes con el constructor de consultas no debes olvidar pasar el ID o una condición que permita restringir la consulta, de lo contrario serán eliminados todos los registros de la tabla.

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Actualización de registros en Laravel 10 o superior Lección siguiente Enviar peticiones con AJAX utilizando Laravel y Blade