DEV Community

Hilmi Hidayat
Hilmi Hidayat

Posted on • Originally published at divisidev.com on

CRUD Laravel 9 #7: Membuat Fitur Pencarian dengan Laravel Scout Database Driver

Laravel 9 Scout - Pada artikel-artikel sebelumnya di series CRUD laravel 9, saya telah membagikan artikel dengan topik create atau tambah data ke database, edit atau update data, implementasi form request validation, penggunaan sweetalert2 di laravel dan implementasi softdeletes di laravel 9. Dan pada artikel ini saya akan membahas tentang implementasi laravel scout package untuk membuat fitur pencarian di laravel 9.

Apa itu Laravel Scout?

Dikutip dari laman resmi laravel, Laravel scout menyediakan solusi sederhana berbasis driver untuk menambahkan full-text search ke Eloquent Model. Menggunakan model observers, Scout akan secara otomatis menjaga indeks pencarian agar tetap sinkron dengan eloquent record. Saat ini, Scout menyediakan opsi driver Algolia, MeiliSearch dan database driver. Selain itu, Scout menyertakan "collection" driver yang dirancang untuk penggunaan local development dan tidak memerlukan external dependencies atau third-party services.

Dan pada artikel ini, saya akan membahas penggunaan laravel scout dengan menggunakan database driver.

Step 1: Install Laravel Scout

composer require laravel/scout
Enter fullscreen mode Exit fullscreen mode

Step yang pertama, install Scout via composer package manager dengan perintah seperti di atas.

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Enter fullscreen mode Exit fullscreen mode

Setelah selesai menginstall Scout, kita perlu publish file config Scout menggunakan perintah artisan vendor:publish seperti di atas. Perintah tersebut, akan mem-publish file config scout.php ke direktori config.

SCOUT_DRIVER=database
Enter fullscreen mode Exit fullscreen mode

Karena kita akan menggunakan database driver, jadi kita perlu menambahkan record seperti di atas pada file .env. Jika tidak ditambahkan, by default Scout akan membaca driver yang digunakan adalah Algolia driver.

Step 2: Setup Post Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Scout\Searchable;

class Post extends Model
{
    use HasFactory, SoftDeletes, Searchable;

    protected $guarded = [];

    public function searchableAs()
    {
        return 'posts_index';
    }

    public function toSearchableArray()
    {
        return [
            'title' => $this->title,
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

Selanjutnya, tambahkan trait Laravel\Scout\Searchable ke model yang ingin kita buat searchable. Trait ini akan mendaftarkan model observer yang secara otomatis menjaga model tetap sinkron dengan driver pencarian kita.

Perhatikan juga pada method toSearchableArray(), disini saya me-return title yang artinya data yang yang dicari dengan parameter dari request pencarian adalah data title pada table posts. Jika kamu ingin mengatur data content juga searchable, kamu dapat mengaturnya dengan menambahkan 'content' => $this->content ,

Step 3: Setup PostController

public function index(Request $request)
{
    $posts = Post::search(request('search'))->paginate(10);
    // or
    // $posts = Post::search($request->search)->paginate(10);

    return view('posts.index',compact('posts'));
}
Enter fullscreen mode Exit fullscreen mode

Lanjut ke controller, disini kita tidak lagi menggunakan where clause seperti Post::where('title', 'like', '%' . request('search') . '%') atau Post::where('title', 'like', "%{$request->search}%"), tapi kita akan menggunakan search method seperti code di atas.

Search method menerima string yang akan digunakan untuk mencari model. Kemudian, kita harus mengaitkan get method ke query pencarian untuk mengambil Eloquent model yang cocok dengan search query yang diberikan.

Step 4: Setup View

<form action="{{ route('posts.index') }}" method="get">
<div class="input-group mb-3">
  <input type="search" name="search" class="form-control" placeholder="Search">
  <button type="submit" class="btn btn-primary">Search</button>
</div>
</form>
Enter fullscreen mode Exit fullscreen mode

Kemudian, mari kita buat search input field di index.blade.php. Copy code di atas, lalu paste di atas table pada file index.blade.php.

Step 5: Testing

Laravel Scout

Setelah melakukan langkah-langkah di atas, sekarang kita bisa mencoba fitur pencarian yang telah kita buat menggunakan laravel scout. Silahkan jalankan laravel project kalian dan buka project pada browser. Cobalah untuk input text apapun itu dan klik search atau enter, maka fitur pencarian yang telah kita buat sudah berjalan dengan baik.

Tambahan

Jika kamu menggunakan softdelete dan ingin menggunakan laravel Scout, kamu perlu mengatur opsi soft_delete dari file config/scout.php ke true.

// Include trashed records when retrieving results...
$posts = Post::search(request('search'))->withTrashed()->get();

// Only include trashed records when retrieving results...
$posts = Post::search(request('search'))->onlyTrashed()->get();
Enter fullscreen mode Exit fullscreen mode

Dan selanjutnya kamu bisa menggunakan method withTrashed dan onlyTrashed untuk mengambil data yang dihapus sementara (soft delete) saat melakukan pencarian.

Mungkin itu saja yang bisa saya share pada artikel ini, semoga artikel ini dapat mudah dipahami dan bisa membantu. Selamat mecoba, dan sampai jumpa pada artikel berikutnya 🚀 👋

Top comments (0)