Using model observer - a separate class to observe model changes and run desired logic

Model observer methods checks if any changes occur around model such as

- created() after record getting creeated
- creating() before record getting created
- updated() after record getting updated
- updating() before record getting updated
- retrieved() after record is retrieved
- saving() before creating/updating a record
- saved() after creating/updating a record
- deleting() before deleting a record
- deleted() after deleting a record
- restoring()
- restored()

In this post, we will be giving example of retrieved() method of model observer. Suppose, if we have a relation like this Post hasMany History and we need to save referecnes of post_id when post is viewed we can create Model observer like below in three steps.

Step 01: Creating PostObserver with php artisan command

php artisan make:observer PostObserver --model=Post


Step 02: Adding following snippet inside App\Observers\PostObserver.php

namespace App\Observers;
use App\Models\Post;
use App\Models\History;

  
class PostObserver
{
	public function retrieved(Post $post) {
	
		preg_match('/([a-z]*)@/i', request()->route()->getActionName(), $controller); // getting current requested controller name 
		preg_match('/@([a-z]*)/i', request()->route()->getActionName(), $action); // getting current requested action name
		
		if( ( $controller[1] == 'PostController' && $action[1] == 'show') ) { 
			// History saving repeatedly for a post
$history = new History(); $history->post_id = $post->id; $history->save();

// or History saving only once for a post
History::firstOrCreate(['post_id'=> $post->id]); } } }


In above snippet, we are saving a reference of post_id in history table when post is viewed by user in the browser in that particular post page.

One thing to note above, a particular controller and action checks are provided not to save History record everytime when post record is retrieved. History saving will be only implemented when user browses to show() method of PostController.

Step 03: Registering PostObserver.php inside boot() method in App/Providers/AppServiceProvider.php

// at the top
use App\Observers\PostObserver;
use App\Models\Post; public function boot() { Post::observe(PostObserver::class); }

Related Posts


Using WhereIn

Updating multiple rows

Using Like

Using orWhere

What is Query Builder?

Using "with" in eloquent query

Getting last inserted id

Selecting last row of a table

Using parameters in find() method

Using local scope in eloquent

Using global scope in eloquent