Simple and Advanced Search in Laravel 5

After we inserted data into our table, we displayed those entries on the browser. Just in case we have hundreds and thousands of records, we need to include search form for faster retrieval of data.

On this tutorial, I have made two options for simple and advanced search in Laravel. If you only have one searchbox, you may need the simple searchbox, if it’s more than one, you might be needing of the advanced feature. Take a look at the guide below.

Search Features

Simple Search
– Search the record of people containing name

Advanced Search
– Name of Person
– Contains an address
– Range of an age

Let’s get started


1. Install Laravel

Open your terminal and download the Laravel Framework by executing the command.

composer create-project --prefer-dist laravel/laravel larasearch

It takes a few minutes to download. Now, go into the larasearch directory.

 cd larasearch 

After that, start your server.

php artisan serve

Open your browser and go to http://localhost:8000

 

2. Configure your .env file

Make sure to configure your .env according to your settings.


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=searchdb
DB_USERNAME=root
DB_PASSWORD=

3. Model and Migration

Let’s create a model and migration and the same time. Open your terminal and execute the command below.

 php artisan make:model People -m 

Database Schema

Navigate to database » migrations » create_people_table.php and add  additional fields.


public function up()
{
Schema::create('people', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('address');
$table->integer('age');
$table->timestamps();
});
}

Next, go to App » Providers » AppServiceProvider.php

use Illuminate\Support\Facades\Schema;
.
.
public function boot()
{
Schema::defaultStringLength(191);
}

Then, execute the migration.

php artisan migrate

After that, add fields as fillable. Go to App  » People.php

protected $fillable = ['name', 'address', 'age']; 

4. Populate People table with data

You can populate data manually so that it will display on your search. But on this tutorial, let’s use laravel factory feature to insert data automatically.

php artisan make:factory Peoplefactory 

Go to database >> factories >> Peoplefactory.php and set the fields to be populated.

$factory->define(App\People::class, function (Faker $faker) {
return [
'name' => $faker->name,
'address' => $faker->address,
'age' => mt_rand(18, 150),
];
});

Notice that I added  mt_rand(18, 150). It automatically adds the age between 18 to 150. Then, let’s execute the faker using artisan tinker.

php artisan tinker
>> factory(App\People::class, 50)->create();

The command above will insert 50 records into your people table. You can now check your table to confirm if data have been successfully inserted.

5. Create Controller

Now, it’s time for us create the controller of our search form. Execute the command below the generate a SearchController.

 php artisan make:controller SearchController 

After that, go to app >> Http >> Controllers >> SearchController.php


namespace App\Http\Controllers;
use Illuminate\Http\Request;
class SearchController extends Controller
{
public function index()
{
$data = \DB::table('people')->paginate(10);
return view('search', compact('data'));
}
public function simple(Request $request)
{
$data = \DB::table('people');
if( $request->input('search')){
$data = $data->where('name', 'LIKE', "%" . $request->search . "%");
}
$data = $data->paginate(10);
return view('search', compact('data'));
}
public function advance(Request $request)
{
$data = \DB::table('people');
if( $request->name){
$data = $data->where('name', 'LIKE', "%" . $request->name . "%");
}
if( $request->address){
$data = $data->where('address', 'LIKE', "%" . $request->address . "%");
}
if( $request->min_age && $request->max_age ){
$data = $data->where('age', '>=', $request->min_age)
->where('age', '<=', $request->max_age);
}
$data = $data->paginate(10);
return view('search', compact('data'));
}
}

6. Configure your Routing

Now, we have to set the routing of our application.

Route::get('/people', 'SearchController@index');
Route::get('/people/simple', 'SearchController@simple')->name('simple_search');
Route::get('/people/advance', 'SearchController@advance')->name('advance_search');

7. Create blade for search

Lastly, we need to display the data into our view.

From your resources folder, create search.blade.php and copy the codes below.


<!DOCTYPE html>
<html>
<head>
<title>Laravel Search</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-4">
<h3>Simple Search</h3><br>
<form action="{{ route('simple_search') }}" method="GET">
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Type the name" aria-describedby="basic-addon2" name="search">
<div class="input-group-append">
<button class="btn btn-secondary" type="submit">Search</button>
</div>
</div>
</form>
<form action="{{ route('advance_search') }}" method="GET">
<h3>Advanced Search</h3><br>
<input type="text" name="name" class="form-control" placeholder="Person's name"><br>
<input type="text" name="address" class="form-control" placeholder="Address"><br>
<label>Range of Age</label>
<div class="input-group">
<input type="text" name="min_age" class="form-control" placeholder="Start Age">
<input type="text" name="max_age" class="form-control" placeholder="End of Age">
</div><br>
<input type="submit" value="Search" class="btn btn-secondary">
</form>
</div>
<div class="col-md-8">
<h3>List of People</h3>
<table class="table table-striped">
<tr>
<th>ID</th>
<th>Name</th>
<th>Address</th>
<th>Age</th>
</tr>
@foreach($data as $pep)
<tr>
<td>{{ $pep->id }}</td>
<td>{{ $pep->name }}</td>
<td>{{ $pep->address }}</td>
<td>{{ $pep->age }}</td>
</tr>
@endforeach
</table>
{{ $data->appends(request()->except('page'))->links() }}
</div>
</div>
</div>
</body>
</html>

Notice that I added a pagination using {{ $data->appends(request()->except('page'))->links() }}. This code is necessary to include the query string whenever the user clicks the pagination link.

And that’s all.

If you have a question, don’t hesitate to ask a question below.

Leave a Reply

Your email address will not be published. Required fields are marked *