Back to Snippets
LaravelPHP

Laravel Eloquent Query Scopes

Reusable query scopes for cleaner and more expressive Eloquent queries.

laraveleloquentscopequery
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    class=class="text-emerald-400">"text-gray">// Local scope — called as Post::published()
    public function scopePublished(Builder 400">$query): Builder
    {
        return 400">$query->whereNotNull(class=class="text-emerald-400">"text-emerald-400">'published_at')
                     ->where(class=class="text-emerald-400">"text-emerald-400">'published_at', class=class="text-emerald-400">"text-emerald-400">'<=', now());
    }

    class=class="text-emerald-400">"text-gray">// Scope with parameter
    public function scopeByCategory(Builder 400">$query, string 400">$category): Builder
    {
        return 400">$query->where(class=class="text-emerald-400">"text-emerald-400">'category', 400">$category);
    }

    class=class="text-emerald-400">"text-gray">// Search scope
    public function scopeSearch(Builder 400">$query, ?string 400">$term): Builder
    {
        if (!400">$term) return 400">$query;

        return 400">$query->where(function (Builder 400">$q) use (400">$term) {
            400">$q->where(class=class="text-emerald-400">"text-emerald-400">'title', class=class="text-emerald-400">"text-emerald-400">'like', class="text-emerald-400">"%{400">$term}%")
              ->orWhere(class=class="text-emerald-400">"text-emerald-400">'content', class=class="text-emerald-400">"text-emerald-400">'like', class="text-emerald-400">"%{400">$term}%");
        });
    }
}

class=class="text-emerald-400">"text-gray">// Usage: Post::published()->byCategory(class=class="text-emerald-400">"text-emerald-400">'tech')->search(400">$request->q)->paginate(10);

How to Use

Define scopes as scopeMethodName on your model. Laravel lets you chain them: Post::published()->byCategory('tech')->paginate(). They keep controllers clean and make queries reusable across the application.

Related Technology

Laravel

Have a Project in Mind?

Let's discuss how we can bring your idea to life. From initial concept to production-ready product — we've got you covered.

or book a free call