mirror of
https://github.com/filamentphp/filament.git
synced 2026-09-21 05:20:26 +08:00
* screenshots * fix cut off sidebar * Screenshots * Screenshots * retake * fix loading data issue * retake * screenshots * Update custom-toolbar.jpg * retake * ss * retake * ss * ss * ss * ss * ss * ss * ss * ss * Update dashboard.jpg * ss * Update openable.jpg * ss * ss * ss * Update database.sqlite * Update database.sqlite * ss * ss * ss * ss * ss * ss * clean up * cs
132 lines
4.7 KiB
Markdown
132 lines
4.7 KiB
Markdown
---
|
|
title: Force-delete action
|
|
---
|
|
import AutoScreenshot from "@components/AutoScreenshot.astro"
|
|
import UtilityInjection from "@components/UtilityInjection.astro"
|
|
|
|
## Introduction
|
|
|
|
Filament includes an action that is able to force-delete [soft-deleted](https://laravel.com/docs/eloquent#soft-deleting) Eloquent records. When the trigger button is clicked, a modal asks the user for confirmation. You may use it like so:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteAction;
|
|
|
|
ForceDeleteAction::make()
|
|
```
|
|
|
|
<AutoScreenshot name="actions/force-delete-action/modal" alt="Force-delete action modal" version="4.x" />
|
|
|
|
Or if you want to add it as a table bulk action, so that the user can choose which rows to force-delete, use `Filament\Actions\ForceDeleteBulkAction`:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteBulkAction;
|
|
use Filament\Tables\Table;
|
|
|
|
public function table(Table $table): Table
|
|
{
|
|
return $table
|
|
->toolbarActions([
|
|
ForceDeleteBulkAction::make(),
|
|
]);
|
|
}
|
|
```
|
|
|
|
## Redirecting after force-deleting
|
|
|
|
You may set up a custom redirect when the form is submitted using the `successRedirectUrl()` method:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteAction;
|
|
|
|
ForceDeleteAction::make()
|
|
->successRedirectUrl(route('posts.list'))
|
|
```
|
|
|
|
<UtilityInjection set="actions" version="4.x">As well as `$record`, the `successRedirectUrl()` function can inject various utilities as parameters.</UtilityInjection>
|
|
|
|
## Customizing the force-delete notification
|
|
|
|
When the record is successfully force-deleted, a notification is dispatched to the user, which indicates the success of their action.
|
|
|
|
To customize the title of this notification, use the `successNotificationTitle()` method:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteAction;
|
|
|
|
ForceDeleteAction::make()
|
|
->successNotificationTitle('User force-deleted')
|
|
```
|
|
|
|
<UtilityInjection set="actions" version="4.x">As well as allowing a static value, the `successNotificationTitle()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
|
|
|
|
You may customize the entire notification using the `successNotification()` method:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteAction;
|
|
use Filament\Notifications\Notification;
|
|
|
|
ForceDeleteAction::make()
|
|
->successNotification(
|
|
Notification::make()
|
|
->success()
|
|
->title('User force-deleted')
|
|
->body('The user has been force-deleted successfully.'),
|
|
)
|
|
```
|
|
|
|
<UtilityInjection set="actions" version="4.x" extras="Notification;;Filament\Notifications\Notification;;$notification;;The default notification object, which could be a useful starting point for customization.">As well as allowing a static value, the `successNotification()` method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>
|
|
|
|
To disable the notification altogether, use the `successNotification(null)` method:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteAction;
|
|
|
|
ForceDeleteAction::make()
|
|
->successNotification(null)
|
|
```
|
|
|
|
## Lifecycle hooks
|
|
|
|
You can use the `before()` and `after()` methods to execute code before and after a record is force-deleted:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteAction;
|
|
|
|
ForceDeleteAction::make()
|
|
->before(function () {
|
|
// ...
|
|
})
|
|
->after(function () {
|
|
// ...
|
|
})
|
|
```
|
|
|
|
<UtilityInjection set="actions" version="4.x">These hook functions can inject various utilities as parameters.</UtilityInjection>
|
|
|
|
## Improving the performance of force-delete bulk actions
|
|
|
|
By default, the `ForceDeleteBulkAction` will load all Eloquent records into memory, before looping over them and deleting them one by one.
|
|
|
|
If you are deleting a large number of records, you may want to use the `chunkSelectedRecords()` method to fetch a smaller number of records at a time. This will reduce the memory usage of your application:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteBulkAction;
|
|
|
|
ForceDeleteBulkAction::make()
|
|
->chunkSelectedRecords(250)
|
|
```
|
|
|
|
Filament loads Eloquent records into memory before deleting them for two reasons:
|
|
|
|
- To allow individual records in the collection to be authorized with a model policy before deletion (using `authorizeIndividualRecords('forceDelete')`, for example).
|
|
- To ensure that model events are run when deleting records, such as the `forceDeleting` and `forceDeleted` events in a model observer.
|
|
|
|
If you do not require individual record policy authorization and model events, you can use the `fetchSelectedRecords(false)` method, which will not fetch the records into memory before deleting them, and instead will delete them in a single query:
|
|
|
|
```php
|
|
use Filament\Actions\ForceDeleteBulkAction;
|
|
|
|
ForceDeleteBulkAction::make()
|
|
->fetchSelectedRecords(false)
|
|
```
|