You can install the package via composer:
composer require nahid-ferdous/laravel-searchable
Import in Model
# Example Model:
use NahidFerdous\Searchable\Searchable;
class User extends Authenticatable
{
use Searchable;
public function country()
{
return $this->belongsTo(Country::class);
}
public function posts()
{
return $this->hasMany(Post::class);
}
}
Publish config file
php artisan vendor:publish --provider="NahidFerdous\Searchable\SearchableServiceProvider"
// e.g search url http://example.com/users?search_query=searchTerm&status=1&date=2020-01-01&date_range=2020-01-01%20-%202020-01-31
Example In single Model:-
# Usage:
$searchQuery = request('search_query');
$users = User::search($searchQuery, ['%name', '%email', 'phone'])->get();
# Output:
User::where('name', 'like', '%'.$searchQuery.'%')
->orWhere('email', 'like', '%'.$searchQuery.'%')
->orWhere('phone', $searchQuery)
->get();
Example with relation:-
# Usage:
$searchQuery = request('search_query'); // e.g. 'bangladesh'
$users = User::search($searchQuery, [
'%name',
'%email',
'%phone',
'country|%name',
'country.city|%$name'
])->get();
# Output:
User::where('name', 'like', '%'.$searchQuery.'%')
->orWhere('email', 'like', '%'.$searchQuery.'%')
->orWhere('phone', 'like', '%'.$searchQuery.'%')
->orWhereHas('country', function ($query) use ($searchQuery) {
$query->where('name', 'like', '%'.$searchQuery.'%');
})
->orWhereHas('country.city', function ($query) use ($searchQuery) {
$query->where('name', 'like', '%'.$searchQuery.'%');
})
->get();
Example of search joining columns:-
# Usage:
$searchQuery = request('search_query');
$users = User::search($searchQuery, [
'%first_name',
'%last_name',
'%first_name+last_name',
])->get();
# Output:
User::where('first_name', 'like', '%'.$searchQuery.'%')
->orWhere('last_name', 'like', '%'.$searchQuery.'%')
->orWhere(DB::raw("concat(first_name, ' ', last_name)"), 'LIKE', "%" . $searchQuery . "%");
->get();
Example of searching multiple conditions:-
# Usage:
$searchQuery = request('search_query');
$status = request('status');
$users = User::search($searchQuery, [
'%first_name',
'%last_name',
'%first_name+last_name',
])
->search(request('status'), ['status'])
->get();
# Output:
User::where('first_name', 'like', '%'.$searchQuery.'%')
->orWhere('last_name', 'like', '%'.$searchQuery.'%')
->orWhere(DB::raw("concat(first_name, ' ', last_name)"), 'LIKE', "%" . $searchQuery . "%")
->where('status', $status)
->get();
Example Date Search:-
# Usage:
$status = request('status');
$date = request('date'); // e.g. 2020-01-01
$users = User::search($status, ['status'])
->searchDate($date, ['created_at'], '>');
->get();
# Output:
User::where('status', $status)
->whereDate('created_at', '>', $date)
->get();
Example Date Range Search:-
# Usage:
$status = request('status');
$dateRange = request('date_range'); // e.g. 2020-01-01 - 2020-01-31 // Must be separated by space and -
$users = User::search($status, ['status'])
->searchDate($dateRange, ['created_at'], '><');
->get();
# Output:
$startDate = explode(' - ', $dateRange)[0];
$endDate = explode(' - ', $dateRange)[1];
$start = Carbon::parse($startDate);
$end = Carbon::parse($endDate);
User::where('status', $status)
->whereBetween($relationAttribute, [$start, $end]);
->get();
Example Date Search With Relation:-
### Coming Soon
Example Date Range Search With Relation:-
### Coming Soon