nahid-ferdous / laravel-searchable
Laravel Package To make Eloquent Queries Shorter.
1.4.0
2024-05-17 17:53 UTC
Requires
- php: >=7.4
- laravel/framework: >=6.0
README
Installation
You can install the package via composer:
composer require nahid-ferdous/laravel-searchable
Usage
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