Skip to content
全部文档

删除记录

删除确认模态删除确认模态

处理软删除

带已删除筛选的资源列表带已删除筛选的资源列表

创建带软删除的资源

默认情况下,你无法在应用中操作已删除的记录。若希望在资源中恢复、强制删除并筛选已删除记录,生成资源时请使用 --soft-deletes 标志:

bash
php artisan make:filament-resource Customer --soft-deletes

为现有资源添加软删除

或者,你也可以为现有资源添加软删除功能。

首先,需要更新资源:

php
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([
            // You may add these actions to your table if you're using a simple
            // resource, or you just want to be able to delete records without
            // leaving the table.
            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,
        ]);
}

然后,如果有编辑页面类,请更新它:

php
use Filament\Actions;

protected function getHeaderActions(): array
{
    return [
        Actions\DeleteAction::make(),
        Actions\ForceDeleteAction::make(),
        Actions\RestoreAction::make(),
        // ...
    ];
}

在列表页删除记录

默认情况下,你可以在表格中批量删除记录。若还想删除单条记录,可使用 DeleteAction

php
use Filament\Actions\DeleteAction;
use Filament\Tables\Table;

public static function table(Table $table): Table
{
    return $table
        ->columns([
            // ...
        ])
        ->recordActions([
            // ...
            DeleteAction::make(),
        ]);
}

授权

对于授权,Filament 会遵循应用中已注册的任意 模型策略

若模型策略的 delete() 方法返回 true,用户即可删除记录。

若策略的 deleteAny() 方法返回 true,用户还可批量删除记录。Filament 使用 deleteAny(),因为逐条检查 delete() 策略性能不佳。

可在 BulkDeleteAction 上使用 authorizeIndividualRecords(),逐条检查 delete() 策略。

软删除授权

forceDelete() 策略方法用于阻止强制删除单条已软删除记录。forceDeleteAny() 用于阻止批量强制删除。Filament 使用 forceDeleteAny(),因为逐条检查 forceDelete() 策略性能不佳。

restore() 策略方法用于阻止恢复单条已软删除记录。restoreAny() 用于阻止批量恢复。Filament 使用 restoreAny(),因为逐条检查 restore() 策略性能不佳。