Reusable query scopes for cleaner and more expressive Eloquent queries.
<?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);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.
Let's discuss how we can bring your idea to life. From initial concept to production-ready product — we've got you covered.