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.

Need help integrating this into your project?

Our team of expert developers can help you build your custom application from scratch.

Hire DigitalCodeLabs