ldc-groupe/app/Http/Controllers/Front/SearchController.php

64 lines
1.8 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers\Front;
use App\Enums\StaticPageType;
use App\Http\Requests\Front\SearchRequest;
use App\Models\StaticPage;
use App\Models\SearchIndex;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Uwil\LaravelCommon\Controllers\Controller;
use Uwil\LaravelCommon\Helpers\CollectionHelper;
class SearchController extends Controller
{
/**
* Search page.
*
* @param \App\Http\Requests\Front\SearchRequest $request
* @return \Illuminate\Contracts\View\View
*/
public function search(SearchRequest $request): \Illuminate\Contracts\View\View
{
$queryKey = trans('front.search.query');
$pageKey = trans('front.search.page');
$searchTerm = $request->validated()[$queryKey];
$currentPage = $request->validated()[$pageKey];
$perPage = 10;
$searchQuery = $this->buildExactSearchQuery($searchTerm);
$resultModels = SearchIndex::search($searchQuery)
->paginateRaw(perPage: $perPage, page: $currentPage);
$resultModels->appends([
$queryKey => $searchTerm,
$pageKey => $currentPage,
'query' => null,
]);
return view('front.pages.search', compact('searchTerm', 'resultModels'));
}
/**
* Set strict search term.
*
* @return string
*/
private function buildExactSearchQuery(string $searchTerm): string
{
$words = preg_split('/\s+/', trim($searchTerm), -1, PREG_SPLIT_NO_EMPTY);
if (count($words) === 1) {
return '"' . $words[0] . '"';
}
$exactTerms = array_map(function($word) {
return $word . '*';
}, $words);
return '+' . implode(' +', $exactTerms);
}
}