Событие deleted
Событие deleted относится к модели Eloquent и вызывается автоматически после того, как модель была успешно удалена из базы данных. Это событие является частью жизненного цикла модели и позволяет выполнить дополнительные действия после удаления записи. Событие получает экземпляр удалённой модели в качестве параметра, что даёт доступ к данным удалённой записи.
Регистрация события
Событие можно зарегистрировать в методе booted модели или через сервис-провайдер:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentFactoriesHasFactory;
class Article extends Model
{
use HasFactory;
protected static function booted()
{
static::deleted(function ($model) {
// Действия после удаления
Log::info("Article deleted: " . $model->id);
});
}
}
?>
Пример
Давайте зарегистрируем событие для модели Article, которое будет удалять связанные комментарии после удаления статьи:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentFactoriesHasFactory;
class Article extends Model
{
use HasFactory;
public function comments()
{
return $this->hasMany(Comment::class);
}
protected static function booted()
{
static::deleted(function ($article) {
$article->comments()->delete();
});
}
}
?>
Теперь при удалении статьи все связанные комментарии будут автоматически удалены:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function destroy($id)
{
$article = Article::find($id);
$article->delete();
return response()->json(['message' => 'Article deleted']);
}
}
?>
Пример
Давайте создадим лог-запись после удаления модели с использованием события deleted:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateSupportFacadesLog;
use IlluminateDatabaseEloquentFactoriesHasFactory;
class Article extends Model
{
use HasFactory;
protected static function booted()
{
static::deleted(function ($article) {
Log::info("Article deleted", [
'id' => $article->id,
'title' => $article->title,
'deleted_at' => now()
]);
});
}
}
?>
Результат выполнения при удалении статьи:
"[2024-01-15 10:30:00] local.INFO: Article deleted {"id":5,"title":"My Article","deleted_at":"2024-01-15 10:30:00"}"
Пример
Регистрация события через сервис-провайдер для выполнения действий после удаления нескольких моделей:
<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
use AppModelsArticle;
use AppModelsUser;
class EventServiceProvider extends ServiceProvider
{
public function boot()
{
Article::deleted(function ($article) {
// Действия после удаления статьи
cache()->forget("article_{$article->id}");
});
User::deleted(function ($user) {
// Действия после удаления пользователя
$user->posts()->delete();
cache()->forget("user_{$user->id}");
});
}
}
?>
Смотрите также
-
событие
deleting,
которое вызывается перед удалением модели -
событие
restored,
которое вызывается после восстановления модели -
событие
forceDeleted,
которое вызывается после принудительного удаления -
метод
delete,
который удаляет модель из базы данных