10-Apr-2023
.
Admin
hii guys,
In this example,I will show you how to add full text search using scout in your laravel 6 application.Here we will use scout ans algolia to perform full text search.
You just need to create an account in algolia.com and create one index where your data will store.
Follow below step to add full text search in your application :
Install Laravel 6
you will create laravel 6 fresh application.
composer create-project --prefer-dist laravel/laravel ScoutFullTextSearch
Install Scout Package
Now here we will run below command to install scout package.
composer require laravel/scout
config/app.php
Add ScoutServiceProvider to providers array in app.php file like as below :
'providers' => [
....
Laravel\Scout\ScoutServiceProvider::class,
]
Publish Assets
Let's go ahead and publish the assets provided by the Scout library using the following command.
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Install Algolia
Now we have to install algolia package by running below command.
composer require algolia/algoliasearch-client-php
Package Configuration
Now we have to create new account in algolia.com. So if you haven't account on algolia.com site then click here and create new account : algolia.com.
From above screenshot you can get app id and secret from dashboard.
config/scout.php
Add id and secret in scout.php file like as below .
'algolia' => [
'id' => env('ALGOLIA_APP_ID', '*******'),
'secret' => env('ALGOLIA_SECRET', '******************'),
],
.env
Also put id and secret in .env file .
ALGOLIA_APP_ID=*********
ALGOLIA_SECRET=***********************
routes/web.php
Add product route in web.php file.
Route::get('product', ['as'=>'product.index','uses'=>'ProductController@index']);
Route::post('product-add', ['as'=>'product.add','uses'=>'ProductController@create']);
Create Controller
Run below command to make product controller
php artisan make:controller ProductController
app\Http\Controllers\ProductController.php
update productcontroller.php like as below :
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
class ProductController extends Controller
{
/**
* Get the index name for the model.
*
* @return string
*/
public function index(Request $request)
{
if($request->has('search')){
$products = Product::search($request->search)->paginate(5);
}else{
$products = Product::paginate(5);
}
return view('product-index',compact('products'));
}
/**
* Get the index name for the model.
*
* @return string
*/
public function create(Request $request)
{
$this->validate($request,[
'name'=>'required',
'quantity'=>'required'
]);
$products = Product::create($request->all());
return back();
}
}
Create Model
Run below command to make product model
php artisan make:model Product
app\Product.php
update product.php like as below :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Product extends Model
{
use Searchable;
public $fillable = [
'name','quantity'
];
/**
* Get the index name for the model.
*
* @return string
*/
public function searchableAs()
{
return 'product';
}
}
Create Blade File
Put below code in your product blade file .
product-index.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Laravel 6 Scout Search</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
<h2 class="mt-5">Laravel 6 Scout Search</h2><br/>
<form method="POST" action="{{ route('product.add') }}" autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="row">
<div class="col-md-4">
<div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}">
<input type="text" id="name" name="name" class="form-control" placeholder="Enter Name" value="{{ old('name') }}">
<span class="text-danger">{{ $errors->first('name') }}</span>
</div>
</div>
<div class="col-md-4">
<div class="form-group {{ $errors->has('quantity') ? 'has-error' : '' }}">
<input type="text" id="quantity" name="quantity" class="form-control" placeholder="Enter Quantity" value="{{ old('quantity') }}">
<span class="text-danger">{{ $errors->first('quantity') }}</span>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<button class="btn btn-primary rounded-0">Create New Product</button>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="row mt-3">
<div class="col-md-12">
<h5><strong>Product</strong></h5><hr>
<form method="GET" action="{{ route('product.index') }}">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<input type="text" name="search" class="form-control" placeholder="Search" value="{{ Request::get('search') }}">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<button class="btn btn-primary rounded-0">Search</button>
</div>
</div>
</div>
</form>
<table class="table table-bordered">
<thead>
<th width="5%">Id</th>
<th>Name</th>
<th>Quantity</th>
</thead>
<tbody>
@if($products->count())
@foreach($products as $key => $value)
<tr>
<td>{{ ++$key }}</td>
<td>{{ $value->name }}</td>
<td>{{ $value->quantity }}</td>
</tr>
@endforeach
@else
<tr>
<td colspan="4">There are no data.</td>
</tr>
@endif
</tbody>
</table>
{{ $products->links() }}
</div>
</div>
</div>
</body>
</html>
It will help you....
#Laravel
#Laravel 6