删除记录
处理软删除
创建软删除资源
默认情况下,你可以在后台面板中操作删除记录。如果你要在资源中添加恢复数据,强制删除和过滤废弃数据功能,请在生成资源时使用 --soft-deletes
标志:
php artisan make:filament-resource Customer --soft-deletes
在现有资源中添加软删除功能
此外,你也可以在现有的资源中添加软删除功能。
首先,更新资源:
use Filament\Resources\Table;use Filament\Tables;use Illuminate\Database\Eloquent\Builder;use Illuminate\Database\Eloquent\SoftDeletingScope; public static function table(Table $table): Table{ return $table ->columns([ // ... ]) ->filters([ Tables\Filters\TrashedFilter::make(), // ... ]) ->actions([ // 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. Tables\Actions\DeleteAction::make(), Tables\Actions\ForceDeleteAction::make(), Tables\Actions\RestoreAction::make(), // ... ]) ->bulkActions([ Tables\Actions\DeleteBulkAction::make(), Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), // ... ]);} public static function getEloquentQuery(): Builder{ return parent::getEloquentQuery() ->withoutGlobalScopes([ SoftDeletingScope::class, ]);}
接下来,更新编辑页面类:
use Filament\Pages\Actions; protected function getActions(): array{ return [ Actions\DeleteAction::make(), Actions\ForceDeleteAction::make(), Actions\RestoreAction::make(), // ... ];}
在列表页中删除记录
默认情况下,你可以在表格中批量删除记录。如果你也想删除但他记录,可以使用 DeleteAction
:
use Filament\Resources\Table;use Filament\Tables; public static function table(Table $table): Table{ return $table ->columns([ // ... ]) ->actions([ // ... Tables\Actions\DeleteAction::make(), ]);}
生命周期
你可以使用 before()
和 after()
方法在删除记录之前/之后执行代码:
DeleteAction::make() ->before(function () { // ... }) ->after(function () { // ... })
停止删除处理过程
你可以随时在生命周期钩子内或者 mutation 方法内调用 $this->halt()
, 停止整个删除处理过程:
use Filament\Notifications\Actions\Action;use Filament\Notifications\Notification; DeleteAction::make() ->before(function (DeleteAction $action) { if (! $this->record->team->subscribed()) { Notification::make() ->warning() ->title('You don\'t have an active subscription!') ->body('Choose a plan to continue.') ->persistent() ->actions([ Action::make('subscribe') ->button() ->url(route('subscribe'), shouldOpenInNewTab: true), ]) ->send(); $action->halt(); } })
如果你想同时关闭操作模态框,你也可以用 cancel()
取消操作,而不必 halt()
:
$action->cancel();
授权
关于授权,Filament 会监听所有应用中注册的模型策略。
如果模型策略的 delete()
方法中返回的是 true
,用户可以访问删除记录。
同时如果模型策略的 deleteAny()
方法中返回的是 true
,用户可以批量删除记录。Filament 之所以使用 deleteAny()
方法时因为多次迭代检查 delete()
方法性能不高。
授权软删除
forceDelete()
策略方法用于防止单条软删除记录被强制删除。forceDeleteAny()
用于防止记录被批量强制删除。
restore()
方法用于防止恢复软删除数据。restoreAny()
用于防止数据被批量恢复。