В моем приложении я использую Laravel Scout с TNTSearch Driver , чтобы создать панель поиска в навигации по моему сайту, которая связана с методом поиска.
Метод поиска выполняет поиск по множеству различных моделей и возвращает найденное в представление.
Вот метод:
/**
* Perform a search given what the user entered into the search box.
* Uses Laravel Scout to do initial search but because the use of WHERE is limited,
* we use a filter function instead, on each collection.
*
* @param Request $request
* @return void
*/
public function search(Request $request)
{
// The search string entered
$search = $request->get('q');
// Laravel Scout search() method
$users = User::search($search)->get();
$articles = Article::search($search)->get();
$events = Event::search($search)->get();
$files = FileMetaData::search($search)->get();
// The date and time as of right now
$today = Carbon::now();
/**
* Below are the filters in place for each model search
* 1. News articles must be open
* 2. \Events are split into open and closed
*/
$articles = $articles->filter(function ($articles) {
return $articles->published === 'published';
});
$upcomingEvents = $events->filter(function ($events) use ($today) {
return $events->startDate->gt($today);
});
$pastEvents = $events->filter(function ($events) use ($today) {
return $events->startDate->lt($today);
});
$userCount = count($users);
$articleCount = count($articles);
$eventCount = count($events);
$upcomingEventCount = count($upcomingEvents);
$pastEventCount = count($pastEvents);
$fileCount = count($files);
return view('pages.search.index', compact('search', 'users', 'articles', 'upcomingEvents', 'pastEvents', 'userCount', 'articleCount', 'upcomingEventCount', 'pastEventCount', 'files', 'fileCount'));
}
Как видите, я использую функцию Scout search()
для поиска в каждой модели, а затем накладываю некоторые дополнительные ограничения на результаты, прежде чем возвращать их в мое представление.
Сам вид
Мне бы хотелось, чтобы выделенный текст сверху также подсвечивал, где это уместно, сами результаты поиска, но я не могу найти ничего в документации об использовании класса TNT Highlighter с Laravel.
Просматривая форумы Laracasts, я нашел это: https://laracasts.com/discuss/channels/laravel/algolia-highlighting-in-laravel-53?page=1
Достопримечательности
<?php
use TeamTNT\TNTSearch\TNTSearch;
$articles = Article::search($searchString)->get();
$tnt = new TNTSearch;
$articles = $articles->map(function($article) use ($searchString, $tnt) {
$article->title = $tnt->highlight($title, $searchString, 'em'),
});
В моем случае мне нужен этот фрагмент для каждого набора результатов?
Обновление:
$articles = Article::search($search)->get();
/**
* Declaire where highlighting should occur for each collection
*/
// Articles
$articles = $articles->map(function($article) use ($search, $tnt){
$article->title = $tnt->highlight($article->title, $search, b, [
'simple' => false,
'wholeWord' => false,
'tagOptions' => [
'class' => 'search-term',
'title' => 'test'
]
]);
return $article;
});