Skip to content

Instantly share code, notes, and snippets.

@zuxbrt
Last active January 26, 2022 13:05
Show Gist options
  • Save zuxbrt/55fa4dd94b799d8d574b349ae95b8f0a to your computer and use it in GitHub Desktop.
Save zuxbrt/55fa4dd94b799d8d574b349ae95b8f0a to your computer and use it in GitHub Desktop.
Laravel eloquent search helper class with pagination
<?php
// composer json
// "php": "^7.3|^8.0",
// "laravel/framework": "^8.75"
class Search
{
public $model;
public $default_search_columns = [
'name',
'email',
// ..and so on (fillable fields in your eloquent model)
];
public function __construct($model)
{
$this->model = $model;
}
public function results(string $searchterm, int $page = null, int $resultsNum = null)
{
$model = new $this->model;
$columns = $model->getFillable();
$searchColumns = [];
foreach($columns as $model_column){
if(in_array($model_column, $this->default_search_columns)) array_push($searchColumns, $model_column);
}
// if paginated results
if($page && $resultsNum){
$allItems = $this->model::orderBy('id', 'desc')
->skip($page * $resultsNum - $resultsNum)
->take($resultsNum)
->where(function($query) use($searchColumns, $searchterm){
foreach($searchColumns as $searchColumn) {
$query->orWhere($searchColumn, "like", '%' . $searchterm . '%');
}
return $query;
})
->select("*")
->get();
$allItemstotal = $this->model::orderBy('id', 'desc')
->where(function($query) use($searchColumns, $searchterm){
foreach($searchColumns as $searchColumn) {
$query->orWhere($searchColumn, "like", '%' . $searchterm . '%');
}
return $query;
})
->select("*")
->get();
$numberOfPages = ceil($allItemstotal->count() / $resultsNum);
$pages = array();
for($i = 1; $i <= $numberOfPages; $i++){
array_push($pages, $i);
}
$results = $allItems->toArray();
$response["numberOfPages"] = $pages;
$response["results"] = $results;
return $response;
} else {
$results = $this->model::where(function($query) use($searchColumns, $searchterm){
foreach($searchColumns as $searchColumn) {
$query->orWhere($searchColumn, "like", '%' . $searchterm . '%');
}
return $query;
});
$searchResults = $results->get();
return $searchResults;
}
}
}
// usage in controller
// $request parameters (GET Method) (*Illuminate\Http\Request instance):
// {your url}?page=1&results=100&term=foo
public function search(Request $request)
{
if(isset($request->page) && isset($request->results)){
if(isset($request->term)){
$search = new Search(User::class);
return $search->results($request->term, $request->page, $request->results);
} else {
$pagination = new Pagination(User::class);
return $pagination->paginate($request->page, $request->results);
}
}
if(isset($request->term)){
$search = new Search(User::class);
return $search->results($request->term);
}
return response(User::all());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment