Require this package with composer. It is recommended to only require the package for development.
composer require putheng/filter
Laravel 5.5 uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.
If you don't use auto-discovery, add the ServiceProvider to the providers array in config/app.php
Putheng\Filter\FilterServiceProvider::class,
Example:
php artisan filter:make CourseFilter
Filter class located app/Filters
Create a new Filter Extension class
php artisan filter:by DifficultyFilter
Filter Extension class located app/Filters/Filter
Add DifficultyFilter
extension to DifficultyFilter
class on $filters
property
use App\Filters\Filter\DifficultyFilter;
protected $filters = [
'difficulty' => DifficultyFilter::class,
];
Setup DifficultyFilter
filter class
namespace App\Filters\Filter;
use Putheng\Filter\FilterAbstract;
use Illuminate\Database\Eloquent\Builder;
class DifficultyFilter extends FilterAbstract
{
/**
* Mappings for database values.
*
* Map b on query string map to beginner column on database
*
* 'b' => 'beginner'
* 'beginner' => 'beginner'
*
* @return array
*/
public function mappings()
{
return [
'b' => 'beginner',
'intermediate' => 'intermediate',
'advanced' => 'advanced',
];
}
/**
* Filter by course difficulty.
*
* @param string $access
* @return Illuminate\Database\Eloquent\Builder
*/
public function filter(Builder $builder, $value)
{
$value = $this->resolveFilterValue($value);
if ($value === null) {
return $builder;
}
return $builder->where('difficulty', $value);
}
}
Add filter scope to model we want to filter, example Course
model
namespace App;
// use filter class we just generated
use App\Filters\CourseFilters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class Course extends Model
{
public function scopeFilter(Builder $builder, Request $request, array $filters = [])
{
return (new CourseFilters($request))->add($filters)->filter($builder);
}
}
Example: Course
and Subject
model,
add polymorphic relationship
public function subjects()
{
return $this->morphToMany(Subject::class, 'subjectable');
}
Builder
return $builder->whereHas('subjects', function (Builder $builder) use ($value) {
$builder->where('slug', $value);
});
On controller use Course
model add filter
method and pass $request
argument
namespace App\Http\Controllers;
use App\Course;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class CourseController extends Controller
{
public function index(Request $request)
{
$filter = Course::filter($request)->get();
}
}