staudenmeir/laravel-cte
Adds Common Table Expression (CTE) support to Laravel’s query builder and Eloquent. Build WITH and recursive CTE queries (plus materialized, custom columns, cycle detection) across MySQL, Postgres, SQLite, SQL Server, MariaDB, Oracle, and SingleStore.
CTE Support for Complex Queries: The package extends Laravel’s query builder and Eloquent to support Common Table Expressions (CTEs), enabling recursive queries, hierarchical data traversal, and multi-step aggregations without procedural logic. This aligns with Laravel’s declarative query philosophy and reduces application-layer complexity.
Performance Gains:
Integration with Laravel Ecosystem:
DB::table() and DB::query().Minimal Code Changes:
composer require command.while loop for hierarchical data with withRecursiveExpression).Database Compatibility:
Testing and Validation:
| Risk Area | Assessment | Mitigation |
|---|---|---|
| Database Compatibility | Some databases lack full CTE support (e.g., MySQL < 8.0). | Audit target databases; upgrade or use alternatives (e.g., temporary tables). |
| Performance Overhead | Recursive CTEs may impact performance on shallow hierarchies (<5 levels). | Benchmark against procedural alternatives; use only for deep/nested data. |
| Cycle Detection | Limited to PostgreSQL 14+/MariaDB 10.5.2. | Implement application-layer checks for other databases. |
| Learning Curve | CTE syntax differs from traditional SQL queries. | Provide team training; document use cases (e.g., "Use CTEs for X, not Y"). |
| Lumen/Oracle Support | Requires manual builder instantiation. | Document setup steps; consider wrapper utilities for common use cases. |
| Future Laravel Versions | Package updates lag behind Laravel (e.g., v1.13 for Laravel 13). | Monitor releases; plan for minor version upgrades. |
Database Strategy:
Use Cases:
Performance:
Team Readiness:
Long-Term Maintenance:
Laravel Versions: Supports Laravel 5.5–13.x (v1.0–1.13). Ensure alignment with your Laravel version:
staudenmeir/laravel-cte:^1.13staudenmeir/laravel-cte:^1.12staudenmeir/laravel-cte:^1.11PHP Versions: Officially supports PHP 8.3–8.4 (default); PHP 8.0+ recommended.
Database Stack:
Architecture Patterns:
Assessment Phase:
Pilot Implementation:
// Before: Nested subqueries
$results = DB::table('orders')
->whereIn('customer_id', function ($query) {
$query->select('id')->from('customers')->where('status', 'active');
})
->get();
// After: CTE
$results = DB::table('orders')
->withExpression('active_customers', DB::table('customers')->where('status', 'active'))
->whereIn('customer_id', DB::table('active_customers')->select('id'))
->get();
EXPLAIN ANALYZE in PostgreSQL).Recursive CTE Rollout:
withRecursiveExpression.// Before: Eloquent recursion
$category = Category::find(1);
$descendants = $category->descendants()->get();
// After: Recursive CTE
$tree = DB::table('categories')
->withRecursiveExpression('tree', function ($query) {
$query->from('categories')
->whereNull('parent_id')
->unionAll(
DB::table('categories')
->select('categories.*')
->join('tree', 'tree.id', '=', 'categories.parent_id')
);
})
->get();
Full Adoption:
QueriesExpressions trait for Laravel < 5.8).How can I help you explore Laravel packages today?