-
Notifications
You must be signed in to change notification settings - Fork 121
Usage
Define the filter logic based on the camel cased input key passed to the filter()
method.
- Empty strings are ignored
-
setup()
will be called regardless of input -
_id
is dropped from the end of the input to define the method so filteringuser_id
would use theuser()
method - Input without a corresponding filter method are ignored
- The value of the key is injected into the method
- All values are accessible through the
$this->input()
method or a single value by key$this->input($key)
- All Eloquent Builder methods are accessible in
this
context in the model filter class.
To define methods for the following input:
[
'company_id' => 5,
'name' => 'Tuck',
'mobile_phone' => '888555'
]
You would use the following methods:
class UserFilter extends ModelFilter
{
protected $blacklist = ['secretMethod'];
// This will filter 'company_id' OR 'company'
public function company($id)
{
return $this->where('company_id', $id);
}
public function name($name)
{
return $this->where(function($q) use ($name) {
return $q->where('first_name', 'LIKE', "%$name%")
->orWhere('last_name', 'LIKE', "%$name%");
});
}
public function mobilePhone($phone)
{
return $this->where('mobile_phone', 'LIKE', "$phone%");
}
public function setup()
{
$this->onlyShowDeletedForAdmins();
}
public function onlyShowDeletedForAdmins()
{
if(Auth::user()->isAdmin()) {
$this->withTrashed();
}
}
public function secretMethod($secretParameter)
{
return $this->where('some_column', true);
}
}
Note: In the above example if you do not want
_id
dropped from the end of the input you can setprotected $drop_id = false
on your filter class. Doing this would allow you to have acompany()
filter method as well as acompanyId()
filter method.
Note: In the example above all methods inside
setup()
will be called every timefilter()
is called on the model
The Filterable
trait also comes with the below query builder helper methods:
EloquentFilter Method | QueryBuilder Equivalent |
---|---|
$this->whereLike($column, $string) |
$query->where($column, 'LIKE', '%'.$string.'%') |
$this->whereBeginsWith($column, $string) |
$query->where($column, 'LIKE', $string.'%') |
$this->whereEndsWith($column, $string) |
$query->where($column, 'LIKE', '%'.$string) |
Since these methods are part of the Filterable
trait they are accessible from any model that implements the trait without the need to call in the Model's EloquentFilter.
Implement the EloquentFilter\Filterable
trait on any Eloquent model:
<?php namespace App;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use Filterable;
//User Class
}
This gives you access to the filter()
method that accepts an array of input:
class UserController extends Controller
{
public function index(Request $request)
{
return User::filter($request->all())->get();
}
}