Laravel 10 Use Scopes in Laravel
Hello Artisan, today I'll show you how to How to Using Scopes in Laravel. Laravel offers a variety of useful tools that you can use on your Eloquent queries to narrow down the results. Encountering scenarios where you need to reuse certain conditions is common. To simplify this process in Laravel models, you can make use of "Scopes," which enable you to encapsulate conditions for readability and reusability. In this article, I'll demonstrate how to seamlessly integrate scopes into your Laravel models.
Here's a simplified version of that condition to retrieve completed projects: "Get all projects that are marked as completed."
$completedProjects = Project::where('completed', 1)->get();
You might need to use the condition mentioned above in different parts of your application. To avoid repetition, you can use Laravel scopes. A scope is like a method in your model that wraps the query syntax used in the example you provided. Scopes are created by adding the word "scope" as a prefix to a method name, like this.
class Project extends Model
{
public function scopeCompleted($query)
{
return $query->where('completed', 1);
}
}
With the scope defined above, you can execute it like so:
$completedProjects = Project::completed()->get();
If you'd like to make the scope adjustable and include projects that haven't been finished, you can provide an argument. Just create an input parameter, similar to how you would for any other method in a model.
class Project extends Model {
public function scopeCompleted($query, $arg)
{
return $query->where('completed', $arg);
}
}
With the input parameter defined, you can use the scope like this:
// Get completed projects
$completedProjects = Project::completed(1)->get();
// Get incomplete projects
$nonCompletedProjects = Project::completed(0)->get();
You might often need to use scopes along with relations. For example, you can get a list of projects that are connected to a user:
$user = User::findOrFail(1); // 1 is user id
$completedProjects = $user->projects()->completed(1)->get();
Laravel scopes are super handy when you've got certain queries you keep using over and over. They let you write the code once and then use it again whenever you need without any fuss.
That's it for today. I hope it'll be helpful in the upcoming project.