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
Step yang pertama, install Scout via composer package manager dengan perintah seperti di atas.
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
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
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,
];
}
}
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'));
}
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>
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
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();
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)