← Back to all snippets
PHP

Defining Reusable Local Query Scopes in Eloquent

Encapsulate common query logic into reusable local scopes in your Laravel Eloquent models, making your code cleaner and more maintainable.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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($query)
    {
        return $query->where('status', 'published');
    }

    /**
     * Scope a query to only include posts with a specific tag.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string  $tag
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeWithTag($query, $tag)
    {
        return $query->whereHas('tags', function ($q) use ($tag) {
            $q->where('name', $tag);
        });
    }

    // Define a relationship to tags (assuming many-to-many)
    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }

    // Example usage:
    // $publishedPosts = Post::published()->get();
    // $recentPublishedPosts = Post::published()->orderBy('created_at', 'desc')->take(5)->get();
    // $phpPosts = Post::withTag('PHP')->published()->get();
}
How it works: Local query scopes allow you to define common query constraints in your Eloquent models, making your code more readable and reusable. A scope method begins with `scope` followed by the PascalCased name of the scope (e.g., `scopePublished`). When calling the scope, you simply reference its name in camelCase (e.g., `Post::published()`). Scopes can also accept arguments, enabling dynamic filtering. They can be chained with other query builder methods or even other scopes, providing a powerful way to build complex queries cleanly.

Need help integrating this into your project?

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

Hire DigitalCodeLabs