Install via Composer:
composer require vendor/package-name
Publish the package config (if needed) and service provider:
php artisan vendor:publish --provider="Vendor\PackageName\PackageServiceProvider"
The package now supports dynamic order-by rule manipulation—key for query builders where sorting logic must be conditionally applied or removed. Start by inspecting the new OrderByManager facade or helper methods like:
applyOrderByRules($rules) – Applies a predefined set of order-by clauses.removeOrderByRules($rules) – Removes specific order-by clauses from the query.First use case: Dynamically adjust sorting in a Model::query() chain based on user preferences or API parameters:
$query = User::query();
$query->applyOrderByRules(['created_at' => 'desc', 'name' => 'asc']); // Applies both
$query->removeOrderByRules(['name']); // Removes 'name' from the query
Use applyOrderByRules() to enforce consistent sorting across multiple query builders (e.g., admin vs. public views):
// Admin dashboard: Always sort by 'active' status first
$query->applyOrderByRules(['active' => 'desc']);
// Public API: Override with user-provided rules
if ($request->has('sort')) {
$query->applyOrderByRules($request->sort);
}
Combine rules dynamically for complex queries:
$baseRules = ['created_at' => 'desc'];
$dynamicRules = ['name' => 'asc'];
// Merge or override rules
$query->applyOrderByRules($baseRules + $dynamicRules);
Extend existing scopes to modify order-by rules:
public function scopeWithSort($query, $rules) {
$query->applyOrderByRules($rules);
return $query;
}
// Usage:
User::withSort(['email' => 'asc'])->get();
Sanitize and parse API input before applying rules:
$rawSort = $request->input('sort', []); // e.g., ["-created_at", "name"]
$parsedRules = collect($rawSort)->mapWithKeys(fn ($value) => [
str_replace('-', '', $value) => str_starts_with($value, '-') ? 'desc' : 'asc'
])->toArray();
$query->applyOrderByRules($parsedRules);
Rule Conflict Resolution:
applyOrderByRules() overwrites existing rules by default. Use mergeOrderByRules() (if available) for additive behavior.['id' => 'asc'] after ['id' => 'desc']).Performance Impact:
removeOrderByRules() to clean up unused clauses.Database Compatibility:
ORDER BY. Test with your target DB.toSql() to verify the final query:
dd($query->toSql());
Custom Rule Parsers:
Extend the package’s rule parser to support custom formats (e.g., sort=created_at:-desc):
// In a service provider:
$parser = app(\Vendor\PackageName\RuleParser::class);
$parser->extend('custom', fn ($value) => [...]);
Event-Based Hooks:
Listen for orderby.rules.applied events to log or modify rules:
\Vendor\PackageName\Events\OrderByRulesApplied::class => function ($event) {
// Modify $event->rules or log them
};
Query Builder Integration:
For raw DB::table() queries, wrap the query builder in the package’s OrderByManager:
$manager = app(\Vendor\PackageName\OrderByManager::class);
$query = $manager->applyTo(DB::table('users'), ['name' => 'asc']);
config/package-name.php to avoid repetitive code:
'defaults' => [
'admin' => ['active' => 'desc'],
'api' => ['created_at' => 'desc'],
],
Then apply them via:
$query->applyOrderByRules(config('package-name.defaults.api'));
How can I help you explore Laravel packages today?