Eliminar registros
Manejo de soft-deletes
Crear un recurso con soft-delete
Por defecto, no podrás interactuar con registros eliminados en la aplicación.
Si deseas añadir funcionalidad para restaurar, eliminar permanentemente y filtrar registros eliminados (trashed) en tu recurso, usa la opción --soft-deletes
al generar el recurso:
php artisan make:filament-resource Customer --soft-deletes
Añadir soft-deletes a un recurso existente
También puedes agregar funcionalidad de soft-delete a un recurso ya existente.
Primero, debes actualizar el recurso:
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->filters([
TrashedFilter::make(),
// ...
])
->recordActions([
// Puedes añadir estas acciones a tu tabla si usas un recurso simple,
// o si solo quieres poder eliminar registros sin salir de la tabla.
DeleteAction::make(),
ForceDeleteAction::make(),
RestoreAction::make(),
// ...
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
ForceDeleteBulkAction::make(),
RestoreBulkAction::make(),
// ...
]),
]);
}
public static function getRecordRouteBindingEloquentQuery(): Builder
{
return parent::getRecordRouteBindingEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
Ahora, actualiza la clase de la página Edit si tienes una:
use Filament\Actions;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
// ...
];
}
Eliminar registros desde la página List
Por defecto, puedes eliminar registros en bloque dentro de tu tabla.
También puedes permitir eliminar un registro individual usando DeleteAction
:
use Filament\Actions\DeleteAction;
use Filament\Tables\Table;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->recordActions([
// ...
DeleteAction::make(),
]);
}
Autorización
Para la autorización, Filament observará las policies de modelos registradas en tu aplicación.
- Los usuarios podrán eliminar registros si el método
delete()
de la policy retornatrue
. - También podrán eliminar en bloque si el método
deleteAny()
retornatrue
.
Filament usadeleteAny()
porque iterar entre múltiples registros y comprobardelete()
no es eficiente.
Puedes usar el método authorizeIndividualRecords()
en BulkDeleteAction
para comprobar la policy delete()
en cada registro individualmente.
Autorización de soft-deletes
- El método
forceDelete()
de la policy se usa para evitar que un registro eliminado sea eliminado permanentemente. - El método
forceDeleteAny()
evita que múltiples registros eliminados sean eliminados permanentemente en bloque.
Filament usa forceDeleteAny()
por eficiencia.
- El método
restore()
evita que un registro eliminado sea restaurado. - El método
restoreAny()
evita restauraciones masivas.
Filament usa restoreAny()
porque resulta más eficiente que revisar restore()
en cada registro.