I faced a scenario when I was working on a project where I had to replicate the `where`
clause in many places and I was getting all the users in many end-points, then I realized that I should get the active users only, you may say Yeah, it's easy, you can walk through all the sections and update the query
. Hmm, I think it's not the correct solution with Laravel
I did not completely know how I could use the retrieved event method, so when I used it, I found that it always gimme a single user instance, NOT a collection or a query builder instance; therefore, I can not control the triggered query, only you can change whatever user attribute:
/**
* Bootstrap the model and its traits.
*/
public static function boot(): void
{
parent::boot();
static::retrieved(function ($user) {
$user->name = 'New Name';
});
}
Do not use any method of getting the data inside the `retrieved`
closure or you will go into an infinite loop because it will call itself again and again.
From my point of view, the most practical solution is the Global Scope; therefore, I went to use it:
/**
* Bootstrap the model and its traits.
*/
public static function boot(): void
{
parent::boot();
static::filterUsers();
}
/**
* Get the active users.
*/
protected static function filterUsers(): void
{
if (request()->is('/api/*')) {
static::addGlobalScope('active', function ($builder) {
$builder->where('active', true);
});
}
}
If you do not need to use the previous scope in a specific place you can use withoutGlobalScope.