a simple trait to use with your Laravel Models
open terminal and run:
composer require dlimars/laravel-searchable
just add in your models
class MyModel extends Model {
use Dlimars\LaravelSearchable\Searchable;
private $searchable = [
'name' => 'LIKE',
'id' => 'MATCH',
'created_at' => 'BETWEEN'
];
}
just call search()
method in model
$filters = [
'name' => 'foo bar',
'id' => '10',
'created_at' => ['2010-01-01 00:00:00', '2015-01-01 23:59:59']
];
$users = User::search($filters)->get();
// produces $query->where('name', 'LIKE', '%foo%')
// ->where('name', 'LIKE', '%bar%')
// ->where('id', '10')
// ->where('created_at', '>=', '2010-01-01 00:00:00')
// ->where('created_at', '<=', '2015-01-01 23:59:59')
$filters = [
'created_at' => ['2010-01-01 00:00:00', null]
];
// produces $query->where('created_at', '>=', '2010-01-01 00:00:00')
$filters = [
'created_at' => [null, '2015-01-01 23:59:59']
];
// produces $query->where('created_at', '<=', '2015-01-01 23:59:59')
you can also use with request
$users = User::search($request()->all())->get();
'LIKE' // produces $query->where('field', 'LIKE', '%{$value}%')
'MATCH' // produces $query->where('field', $value)
'BETWEEN' // produces $query->where('field', '>=', $value[0])
// ->where('field', '<=', $value[1])
You can create a custom scope in your models, and call as operator.
Example of class:
class Customer extends EloquentModel
{
use Searchable;
public $fillable = [
'firstname',
'lastname'
];
public $searchable = [
'id' => 'MATCH',
'name' => 'myCustomSearchByName'
]
public function scopeMyCustomSearchByName($queryBuilder, $name)
{
$name = str_slug($name, "%");
$queryBuilder->where(
\DB::raw('CONCAT(firstname, " ", lastname'),
'LIKE',
"%{$name}%"
);
}
}
and call
$filters = ['name' => 'Foo bar example'];
$customers = Customer::search($filters)->get();