Recently I’m learning Laravel and write notes about Eloquent model events.
Eloquent Model Events
Eloquent model events enable automatic execution at critical model lifecycle stages—before saving, after updating, or during deletion. This facilitates tasks like setting defaults, logging changes, sending notifications, or enforcing business rules without complicating logic.
Throughout their lifecycle, Eloquent models trigger several events.
retrieved: after a record is retrievedcreating: before a new record is createdcreated: after a new record is createdupdating: before an existing record is updatedupdated: after an existing record is updatedsaving: before a record is saved (created or updated)saved: after a record is saved (created or updated)deleting: before a record is deleteddeleted: after a record is deletedrestoring: before a soft-deleted record is restoredrestored: after a soft-deleted record is restored
How to Use Eloquent Model Events Events
You can register event listeners in your Eloquent model by overriding the boot method. Here is a practical example using the User model:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
final class User extends Model
{
use SoftDeletes;
protected static function boot()
{
parent::boot();
static::retrieved(function ($user) {
// After a record is retrieved
// Example: $user = User::find(1);
printf("User retrieved: %d\n", $user->id);
// User retrieved: 1
});
static::creating(function ($user) {
// Before a new record is created
// Example: $user = User::create([]);
if (empty($user->email)) {
$user->email = 'default_' . uniqid() . '@example.com';
}
printf("User creating: email=%s id=%s\n", $user->email, $user->id ?? 'null');
// User creating: [email protected] id=null
});
static::created(function ($user) {
// After a new record is created
// Example: $user = User::create([]);
printf("User created and exists in DB: email=%s id=%d\n", $user->email, $user->id);
// User created and exists in DB: [email protected] id=20
});
static::updating(function ($user) {
// Before an existing user is updated
// Example: $user->update(['email' => '[email protected]']);
printf("Current user email in DB: %s\n", $user->getOriginal('email'));
// Current user email in DB: [email protected]
printf("User updating: id=%d email=%s\n", $user->id, $user->email);
// User updating: id=23 [email protected]
});
static::updated(function ($user) {
// After an existing user is updated
// Example: $user->update(['email' => '[email protected]']);
printf("User updated: id=%d email=%s\n", $user->id, $user->email);
// User updated: id=23 [email protected]
});
static::saving(function ($user) {
// Before a user is saved (created or updated)
// Example: $user = User::create([])
printf("User saving: id=%s email=%s\n", $user->id ?? 'null', $user->email ?? 'null');
// User saving: id=null email=null
});
static::saved(function ($user) {
// After a user is saved (created or updated)
// Example: $user = User::create([])
printf("User saved: id=%d email=%s\n", $user->id, $user->email);
// User saved: id=25 [email protected]
});
static::deleting(function ($user) {
// Before a user is deleted
// Example: $user->delete();
printf(
"[deleting] User exists in DB? %s, isTrashed? %s\n",
User::where('id', $user->id)->exists() ? 'yes' : 'no',
$user->trashed() ? 'yes' : 'no'
);
// [deleting] User exists in DB? yes, isTrashed? no
printf("User deleting: id=%d email=%s\n", $user->id, $user->email);
// User deleting: id=27 [email protected]
});
static::deleted(function ($user) {
// After a user is deleted
// Example: $user->delete();
printf(
"[deleted] User exists in DB? %s, isTrashed? %s\n",
User::where('id', $user->id)->exists() ? 'yes' : 'no',
$user->trashed() ? 'yes' : 'no'
);
// [deleted] User exists in DB? no, isTrashed? yes
printf("User deleted: id=%d email=%s\n", $user->id, $user->email);
// User deleted: id=27 [email protected]
});
static::restoring(function ($user) {
// Before a soft-deleted user is restored
// Example: $user->restore();
printf(
"[restoring] User exists in DB? %s, isTrashed? %s\n",
User::where('id', $user->id)->exists() ? 'yes' : 'no',
$user->trashed() ? 'yes' : 'no'
);
// [restoring] User exists in DB? no, isTrashed? yes
printf("User restoring: id=%d email=%s\n", $user->id, $user->email);
// User restoring: id=27 [email protected]
});
static::restored(function ($user) {
// After a soft-deleted user is restored
// Example: $user->restore();
printf(
"[restored] User exists in DB? %s, isTrashed? %s\n",
User::where('id', $user->id)->exists() ? 'yes' : 'no',
$user->trashed() ? 'yes' : 'no'
);
// [restored] User exists in DB? yes, isTrashed? no
printf("User restored: id=%d email=%s\n", $user->id, $user->email);
// User restored: id=27 [email protected]
});
}
}