Blog

Laravel naming scopes and methods

23-11-2021 · in laravel-developer

Scopes

In Laravel filters or scopes, better said, can be used when you query a model with a specific method chain. We can start from the following example:
	Post::whereNotNull('published_at')->get();
This will take all the posts that are having the published_at column not null, or in simpler words all the posts that are active. With scopes this will look like this:
	class Post extends Model
	{
        /**
         * The attributes that should be cast to native types.
         *
         * @var array
         */
        protected $casts = [
            'published_at' => 'datetime',
        ];
	
        public function scopeActive($query)
        {
            return $query->whereNotNull('published_at');
        }
	}
The usage is like this:
	Post::active()->get();
The scopes can also accept parameters, as you may need to have a scope that accepts a date and then you can rename the scope like 'scopePublishedUntil' or 'scopePublishedBefore'. This can look like this:
    public function scopePublishedUntil($query, $param)
    {
        return $query->where('published_at', '<=', $param);
    }
You can use it like this:
	Post::publishedUntil('2021-11-09')->get();

Has/Is Methods

You can write the methods as you prefer, but keep in mind the basic thing: naming is the key! This is also the most dificult thing to do in programming. I recently encountered a huge bug in some code and that is the naming of so called 'boolean functions' or function that should only return a boolean. The simple rule is that what ever the method name, if it beggins with the words "is" or "has" then the return type must be a boolean. I will give a right example:
    public function isPublished(): bool
    {
        return $this->published_at !== null;
    }
This method will return 'true' or 'false' based on the condition inside. You must watch out for anything else then a boolean for the return type. once again the naming is the key!

source