Skip to content

[Laravel] Eloquent Model Events: Before Create, Save, Update, and Delete

Published: at 09:00 AM (4 min read)

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.

  1. retrieved: after a record is retrieved
  2. creating: before a new record is created
  3. created: after a new record is created
  4. updating: before an existing record is updated
  5. updated: after an existing record is updated
  6. saving: before a record is saved (created or updated)
  7. saved: after a record is saved (created or updated)
  8. deleting: before a record is deleted
  9. deleted: after a record is deleted
  10. restoring: before a soft-deleted record is restored
  11. restored: 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=default_68bbf2f596198@example.com 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=default_68bbf3adb138a@example.com id=20
    });

    static::updating(function ($user) {
      // Before an existing user is updated
      // Example: $user->update(['email' => 'new@email.com']);
      printf("Current user email in DB: %s\n", $user->getOriginal('email'));
      // Current user email in DB: default_68bbf776878b6@example.com
      printf("User updating: id=%d email=%s\n", $user->id, $user->email);
      // User updating: id=23 email=new@email.com
    });

    static::updated(function ($user) {
      // After an existing user is updated
      // Example: $user->update(['email' => 'new@email.com']);
      printf("User updated: id=%d email=%s\n", $user->id, $user->email);
      // User updated: id=23 email=new@email.com
    });

    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=default_68bbf87cc3bad@example.com
    });

    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=default_68bbfa61bcb77@example.com
    });

    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=default_68bbfa61bcb77@example.com
    });

    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=default_68bbfa61bcb77@example.com
    });

    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=default_68bbfa61bcb77@example.com
    });
  }
}

Previous Post
[LeetCode] 49. Group Anagrams
Next Post
[LeetCode] 48. Rotate Image