This is continuity form the previous post here.
I was asked if it is possible, if we create a Global Search? Yes it is possible. We are the programmer, we program things how they should behave and act.
I did minor changes on route and helper, then it's done!
TLDR;
The route:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->get('/search', function (Request $request) {
abort_if(
empty($request->search),
404,
'Please provide search keyword'
);
return search($request);
});
And the helper:
<?php
use App\Enums\SearchType;
use Illuminate\Http\Request;
use Laravel\Scout\Searchable;
if (! function_exists('search')) {
function search(Request $request = null)
{
if(is_null($request)) {
$request = request();
}
$type = SearchType::tryFrom($request->type);
$keyword = $request->search;
$paginate = $request->query('paginate', false);
$types = empty($type) ? SearchType::cases() : [$type];
$data = [];
foreach ($types as $type) {
throw_if(
! in_array(Searchable::class, class_uses_recursive($type->value))
);
$class = $type->value;
$query = $class::search($keyword);
$data[$type->label] = $paginate
? $query->paginate()
: $query->first();
}
return [
'data' => $data,
'meta' => [
'searched_at' => date('Y-m-d H:i:s')
],
];
}
}
I also update my enum, remove the labels()
ovewrite:
<?php
namespace App\Enums;
use Spatie\Enum\Laravel\Enum;
/**
* @method static self user()
* @method static self profile()
*/
class SearchType extends Enum
{
public static function values(): array
{
return [
'user' => \App\Models\User::class,
'profile' => \Profile\Models\Profile::class,
];
}
}
Now you are done! A Global Search in action.
Top comments (0)