Laravel 12.19: Elegant Query Builders with PHP Attributes
July 7, 2025Laravel 12.19: Elegant Query Builders with PHP Attributes
In Laravel 12.19, you can now use the #[UseEloquentBuilder] PHP attribute to assign a custom query builder to a model—no need to override newEloquentBuilder() anymore. It's cleaner and more maintainable.
Why Use a Custom Query Builder?
- Keep models lean—models focus on relationships, not query logic.
- Centralize reusable logic like
wherePublished()in one place. - Organize code better—all custom queries live together.
The Old Way
// app/Models/Article.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Builders\ArticleBuilder;
class Article extends Model {
public function newEloquentBuilder($query) {
return new ArticleBuilder($query);
}
}
The New Way
// app/Models/Article.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Builders\ArticleBuilder;
use Illuminate\Database\Eloquent\Attributes\UseEloquentBuilder;
#[UseEloquentBuilder(ArticleBuilder::class)]
class Article extends Model {
// no more override!
}
Builder Example
// app/Builders/ArticleBuilder.php
namespace App\Builders;
use Illuminate\Database\Eloquent\Builder;
class ArticleBuilder extends Builder {
public function whereActive(): static {
return $this->where('is_active', true);
}
public function recent(int $days = 7): static {
return $this->whereDate('created_at', '>=', now()->subDays($days));
}
public function byCategory(string $slug): static {
return $this->whereHas('category', fn($q) => $q->where('slug', $slug));
}
}
Usage
$articles = Article::query()
->whereActive()
->recent(14)
->byCategory('tech')
->orderByDesc('published_at')
->paginate(10);
Pro Tips
- ✅ Only use when query logic gets reused.
- ⚙️ Keep method names flexible, e.g.
recent(int $days). - 🧪 Add unit tests for each builder method.
- 📘 Consider combining with global scopes.
This feature was introduced in Laravel 12.19 along with other improvements like AsFluent, FailOnException job middleware, and new response assertion methods.
Blog
Jun 30, 2025
📌 Building a Task Reminder App This guide shows how to set up a Laravel app using MongoDB to implement a task reminder system with authentication,...
Jun 26, 2025
Color Everything in CSS – Simple Guide Today we’re diving into CSS colors: how to define them, especially with modern methods like lab(...
Jul 28, 2025
🚀 What’s New in React Native 0.80? The React Native 0.80 release marks a pivotal moment in mobile development. This update not only enhances...
Jul 01, 2025
Essential React Native UI & Interaction Components React Native provides a powerful set of built-in components for creating native mobile apps....
Jul 20, 2025
Laravel Context is one of the most powerful new features in Laravel 12. It allows you to attach contextual data (like user ID, IP address, request pat...
Jul 01, 2025
🚫 Stop Copy-Pasting Code! Ever duplicated slug logic or logging across multiple models? Laravel's Traits got your back. 1. What’s a Trait?...