Laravel Scout Search Example with Database Engine
In today's tutorial, we are going to see how to implement search using Laravel Scout with a database engine.
So let's assume that we have a Post Model and a Post Controller and we want to perform a search based on the title and the body of a post.
Install the package and publish the configuration
First, let's install the package and publish the configuration by running these commands:
composer require laravel/scout
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Add Searchable trait to the post model
Next, we add the Searchable trait to the post model.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use HasFactory, Searchable;
protected $fillable = [
'title','body'
];
}
Add the toSearchableArray method to post model
Next, we add the toSearchableArray method to the post model.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use HasFactory, Searchable;
protected $fillable = [
'title','body'
];
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray()
{
return [
'title' => $this->title,
'body' => $this->body,
];
}
}
Set the engine to database
Next, inside the .env file we set the engine to the database.
SCOUT_DRIVER=database
Add the search method to the PostController
Next, we add the search method to the Post Controller.
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
//
public function searchByTerm(Request $request){
$posts = Post::search($request->term)->get();
return view('home')->with([
'posts' => $posts
]);
}
}