Installation
composer require onemustcode/query
Ensure your project uses Laravel 5.x (last release was 2017).
Basic Usage
use OneMustCode\Query\QueryBuilder;
$query = QueryBuilder::forModel(User::class)
->applyRequest($request) // Automatically parses filters, sorting, and pagination
->get();
First Use Case: API Filtering
// In a controller
public function index(Request $request) {
$users = QueryBuilder::forModel(User::class)
->applyRequest($request)
->get();
return response()->json($users);
}
Send a request with query params like:
/api/users?name=John&sort=-created_at&page=2
QueryBuilder::forModel(User::class)
->where('name', 'John')
->where('active', true)
->get();
$query = QueryBuilder::forModel(User::class)
->applyRequest($request, [
'name', // Exact match
'email', // Exact match
'active', // Boolean
'role', // IN query
'created_at' // Date range (format: `created_at[from]=2020-01-01&created_at[to]=2020-12-31`)
]);
QueryBuilder::forModel(User::class)
->orderBy('name', 'asc')
->get();
$query = QueryBuilder::forModel(User::class)
->applyRequest($request, [], ['name', 'email', 'created_at']);
Request format:
/api/users?sort=-created_at,name
QueryBuilder::forModel(User::class)
->paginate(10);
$query = QueryBuilder::forModel(User::class)
->applyRequest($request);
Request format:
/api/users?page=2&per_page=20
QueryBuilder::forModel(User::class)
->with('posts')
->applyRequest($request)
->get();
use OneMustCode\Query\QueryBuilder as BaseQueryBuilder;
class CustomQueryBuilder extends BaseQueryBuilder {
public function activeOnly() {
return $this->where('active', true);
}
}
// Usage
CustomQueryBuilder::forModel(User::class)
->activeOnly()
->applyRequest($request)
->get();
Deprecated Laravel Version
SQL Injection Risks
applyRequest().$validated = $request->validate([
'name' => 'sometimes|string',
'email' => 'sometimes|email',
]);
$query = QueryBuilder::forModel(User::class)
->applyRequest($validated);
Date Range Handling
created_at[from]) assume from and to params. Validate these exist to avoid errors:
if ($request->has('created_at.from') && $request->has('created_at.to')) {
$query->whereBetween('created_at', [
$request->input('created_at.from'),
$request->input('created_at.to')
]);
}
Boolean Fields
active) expect 1/0 or true/false in the request. Explicitly cast if needed:
$query->where('active', (bool) $request->input('active'));
Log the Final Query
$query = QueryBuilder::forModel(User::class)
->applyRequest($request)
->toSql(); // Log this to debug
dd($query->getBindings());
Disable Automatic Application
applyRequest() to debug:
$query = QueryBuilder::forModel(User::class);
// Manually add conditions for testing
Check for Deprecated Methods
Custom Filter Logic
applyFilters method in a custom builder:
class CustomQueryBuilder extends BaseQueryBuilder {
protected function applyFilters(array $filters) {
foreach ($filters as $field => $value) {
if ($field === 'custom_field') {
$this->where('custom_logic', $value);
continue;
}
parent::applyFilters([$field => $value]);
}
}
}
Add Custom Sorting Rules
applySorting method to handle custom sort fields:
protected function applySorting(array $sorts) {
foreach ($sorts as $sort) {
if (strpos($sort, 'custom_') === 0) {
$this->orderBy('custom_logic_column', $sort[7] ?? 'asc');
continue;
}
parent::applySorting([$sort]);
}
}
Integration with API Resources
return UserResource::collection(
QueryBuilder::forModel(User::class)
->applyRequest($request)
->get()
);
Select Specific Columns
QueryBuilder::forModel(User::class)
->select(['id', 'name', 'email'])
->applyRequest($request)
->get();
Avoid N+1 Queries
with() for relationships:
QueryBuilder::forModel(User::class)
->with('posts.comments')
->applyRequest($request)
->get();
Cache Query Results
return Cache::remember("users_{$request->page}", now()->addHours(1), function() {
return QueryBuilder::forModel(User::class)
->applyRequest($request)
->paginate(10);
});
How can I help you explore Laravel packages today?