In my application, I am using Laravel Scout with the TNTSearch Driver to create a search bar in my site navigation, which is connected to a search method.
The search method searches a bunch of different models and returns what it finds to a view.
Here is the method:
/**
* 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'));
}
As you can see, I'm using Scout's search()
function to search each model and then put some additional constraints on the results, before returning them to my view.
The view itself
I would like the highlighted text at the top to also highlight where appropriate with the search results themselves but I can't seem to find anything in the documentation about using the TNT Highlighter class with Laravel.
Trawling through Laracasts forums, I found this: https://laracasts.com/discuss/channels/laravel/algolia-highlighting-in-laravel-53?page=1
Point of interest
<?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'),
});
In my case would I need this snippet for each result set?
via Chebli Mohamed
Aucun commentaire:
Enregistrer un commentaire