PHP
Reusable Query Filters with Eloquent Local Scopes
Define reusable query constraints within your Eloquent models to simplify filtering and improve code readability for common data retrieval patterns.
// In app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Post extends Model
{
/**
* Scope a query to only include published posts.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePublished(Builder $query): Builder
{
return $query->where('is_published', true)
->where('published_at', '<=', now());
}
/**
* Scope a query to only include posts by a given user.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $userId
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeByUser(Builder $query, int $userId): Builder
{
return $query->where('user_id', $userId);
}
}
// Usage example in a controller or service
// Get all published posts
$publishedPosts = Post::published()->get();
// Get published posts by a specific user
$userPosts = Post::published()->byUser(123)->get();
How it works: Local scopes allow you to define common sets of query constraints directly on your Eloquent models. By prefixing a method name with `scope` (e.g., `scopePublished`), you can then call that method directly on the model or query builder (e.g., `Post::published()`). This promotes reusability, makes your queries more expressive, and keeps your controllers or services cleaner by abstracting common filtering logic.