Sofdeleted y Forcedelete

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 6

ELIMINACION DE UN REGISTRO

Para borrar correctamente un registro, con el mensaje de confirmación:

1ra forma:

<form id="elimina-prod" action="{{ route('producto.borrar', $prod->id)


}}" method="post">
@csrf
@method('delete')

<input class="bg-red-500 hover:bg-red-700 text-white font-bold py-1 px-2


border border-red-500 rounded" type="submit" value="Eliminar"

onclick="if(confirm('¿Confirma eliminar a <?php echo $prod->nombre


?>?')){document.getElementById('elimina-prod').submit()};" />

</form>

2da forma:

<form id="elimina-prod" action="{{ route('producto.borrar', $prod->id)


}}" method="post">
@csrf
@method('delete')

<input class="bg-red-500 hover:bg-red-700 text-white font-bold py-1 px-2


border border-red-500 rounded" type="submit" value="Eliminar"
onclick="if(!confirm('¿Confirma eliminar a {{ $prod->nombre }}?')){return
false;}" />

</form>

ELIMINACION LOGICA CON SOFTDELETES:


✓ Para realizar una eliminación lógica, necesitamos de un campo en la tabla
productos, llama “deleted_at” de tipo TIMESTAMP, para registrar la fecha de
la eliminación lógica, para ello debemos adicionar dicho campo con:

php artisan make:migration add_deleted_at_to_productos_table

✓ Una vez creada la migración:


2024_04_23_202641_add_deleted_at_to_productos_table.php, adicionar el
siguiente código al archivo:

public function up(): void

{
Schema::table('productos', function (Blueprint $table) {
//
$table->timestamp('deleted_at')->after('categoria') ->nullable();
});
}

public function down(): void


{
Schema::table('productos', function (Blueprint $table) {
//
$table->dropColumn('deleted_at');
});
}

$table->timestamp('deleted_at')->nullable();

✓ Luego migramos a la tabla productos de la base de datos con :

php artisan migrate

Resultados en la tabla productos:

✓ Aparte de lo anterior, en el Modelo Producto hacer uso del método


SoftDeletes, que hace posible la eliminación lógica del registro:

use SoftDeletes;

✓ En el controlador mantener el código:

public function destroy(Producto $id)

{
$id->delete();//usamos el metodo delete para eliminar el objeto
return redirect()->Route('producto.index');//redireccionamos a la
vista index.
}

DE ESA FORMA ELIMINAREMOS EL REGISTRO DE LA VISTA INDEX Y NO ASI DE LA BASE DE


DATOS YA QUE EN LA BD SOLO SE REGISTRARA LA FECHA DE ELIMINACION LOGICA:

✓ Para eliminar de la base de datos definitivamente cambiar el metodo delete()


por forceDelete():

public function destroy(Producto $id)

{
$id->forceDelete();//usamos el metodo delete para eliminar el
objeto

return redirect()->Route('producto.index');//redireccionamos a la
vista index.
}

Y ASI SE ELIMINARÁ EL REGISTRO DEFINITIVAMENTE DE LA BASE DE DATOS


9. CRUD CON SOFTDELETES Y FORCEDELETES

✓ Para usar una eliminación lógica primeramente nos crearemos una


función para desactivar un producto, para ello, en productoController,
escribir:
public function desactivaproducto($id){

//echo "el empleado eliminado es: $id";


$pro=Producto::find($id);
//return $pro;
$pro->delete();
return redirect()->Route('producto.index');
}

✓ Para esa funcion crear la ruta:

Route::get('desactiva/{id}','desactivaproducto')->name('desactivapro');

✓ En index.blade.php, pondremos el botón de desacrivar:


<a href="{{route('desactivapro', $prod->id)}}">

<button type="button" class="bg-gray-500 hover:bg-gray-700 text-white


font-bold py-1 px-2 border border-gray-500 rounded">Desactivar</button>
</a>

Resultado en la vista:

Para visualizar los registros desactivados, en ProductoController, en la funcion index() :


public function index()
{
$pro = Producto::withTrashed()->paginate(10);
//return $pro;
return view('index', ['producto' => $pro]);
}
Para que podamos volver a activar los registros desactivados, nos creamos también el
botón activar en index.blade.php, que se encontrara en el siguiente if:
@if ($prod->deleted_at)

<a href="{{ route('activapro', $prod->id) }}">


<button type="button" class="bg-green-500 hover:bg-green-700 text-white
font-bold py-1 px-2 border border-green-500 rounded">Activar</button>
</a>

@else

<a href="{{ route('desactivapro', $prod->id) }}">


<button type="button" class="bg-gray-500 hover:bg-gray-700 text-white
font-bold py-1 px-2 border border-gray-500 rounded">Desactivar</button>
</a>

@endif

Para el boton de activar de igual forma, en web.php, crear la ruta de activacion:

Route::get('activa/{id}','activaproducto')->name('activapro');

Y en ProductoController:
public function activaproducto($id){
$pro=Producto::withTrashed()->find($id);
// return $pro;

$pro->restore($id);
return redirect()->Route('producto.index');
}

Para eliminar completamente un registro, en index.blade.php, adicionar al if, el boton


de eliminar que anteriormente ya teniamos:

@if($prod->deleted_at)

<a href="{{route('activapro', $prod->id)}}">


<button type="button" class="bg-green-500 hover:bg-green-700 text-white
font-bold py-1 px-2 border border-green-500 rounded">Activar</button>
</a>

<form id="elimina-prod" action="{{ route('producto.borrar', $prod->id)


}}" method="post">
@csrf
@method('delete')
<input class="bg-red-500 hover:bg-red-700 text-white font-bold py-1
px-2 border border-red-500 rounded" type="submit" value="Eliminar"
onclick="if(confirm('¿Confirma eliminar a <?php echo $prod->nombre
?>?')){document.getElementById('elimina-prod').submit()};" />

</form>

@else

<a href="{{route('desactivapro', $prod->id)}}">


<button type="button" class="bg-gray-500 hover:bg-gray-700 text-white
font-bold py-1 px-2 border border-gray-500 rounded">Desactivar</button>
</a>

@endif

Que en web.php, ya temenos la ruta:

Route::delete('producto/{id}', 'borrar')->name('producto.borrar');

Pero modificar la funcion de borrar en ProductoController:


public function borrar($id)
{
$pro=Producto::withTrashed()->find($id);
$pro->forceDelete();
return redirect()->Route('producto.index');

Resultado en index.blade.php:

También podría gustarte