janakkapadia / filterable
Enhance your Laravel app with dynamic, customizable filtering for Eloquent models. This package provides an easy setup for multi-parameter filtering, custom logic, and relationship support—perfect for building flexible, data-driven features like admin panels and reports.
Fund package maintenance!
Buy Me A Coffee
Installs: 12
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
Type:package
Requires
- php: ^8.1
- illuminate/support: ~9|~10|^11
README
A custom Laravel package for dynamic filtering of models, built to simplify the process of filtering data in Laravel applications.
Installation
-
Install via Composer
Run the following command to add the package to your Laravel project:
composer require janakkapadia/filterable
-
Usage
This package provides a command to generate filter models dynamically.
Creating a New Filter Model:
php artisan filter:model {ModelName}
-
Add Filter Trait to Your Model
use JanakKapadia\Filterable\Traits\Filter; class YourModel extends Model { use Filter; // Additional model code... }
-
Usage In Controller
Basic filtering:
public function index(Request $request) { $data = YourModel::filter()->get(); }
With parentheses wrapping where conditions:
public function index(Request $request) { $data = YourModel::filter(true)->get(); }
-
Request Example
To filter and sort the data, you can make a request like this:
GET URL/your-model?sort_by=id&search=title&status=active
-
Example Usage For Model Filter File
In your filter model (YourModelFilter.php), you can define both filter and sort methods:
class YourModelFilters extends Filter { // Define your filterable fields protected array $filters = ['search', 'status']; // Define your sortable fields protected array $sort = ['sort_by']; // Sort method public function sort_by($column): void { $this->builder->orderBy($column); } // Filter methods public function search($keyword): void { $this->builder->where(function ($query) use ($keyword) { $query->where('field1', 'like', "%$keyword%") ->orWhere('field2', 'like', "%$keyword%"); }); } public function status($status): void { $this->builder->where('status', $status); } }
-
Query Examples
Without parentheses (
filter()
):SELECT * FROM your_models WHERE field1 LIKE '%keyword%' OR field2 LIKE '%keyword%' AND status = 'active' ORDER BY id DESC
With parentheses (
filter(true)
):SELECT * FROM your_models WHERE (field1 LIKE '%keyword%' OR field2 LIKE '%keyword%') AND (status = 'active') ORDER BY id DESC
The parentheses version ensures proper grouping of conditions and can prevent unexpected results when combining multiple filters.
-
Advanced Features
- Parentheses Wrapping: Use
filter(true)
to wrap where conditions in parentheses for complex queries - Filter Chaining: You can chain multiple filter operations together
- Separate Filter and Sort Fields: Define filterable fields in
$filters
array and sortable fields in$sort
array
- Parentheses Wrapping: Use