Tutorial PostgreSQL di Laravel: Setup, JSONB, dan Full-Text Search
Laravel secara default menggunakan MySQL. Tapi kalau proyek Anda butuh fitur seperti JSON columns yang lebih canggih, full-text search bawaan, atau JSONB, PostgreSQL adalah pilihan yang solid.
Artikel ini membahas cara setup PostgreSQL di Laravel, termasuk konfigurasi, perbedaan dengan MySQL, dan fitur-fitur PostgreSQL yang bisa dimanfaatkan langsung dari Eloquent.
Instalasi dan Konfigurasi
Pastikan extension PHP untuk PostgreSQL sudah aktif:
# Ubuntu/Debian
sudo apt install php-pgsql
# Cek apakah sudah aktif
php -m | grep pdo_pgsql
Edit file .env:
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=nama_database
DB_USERNAME=postgres
DB_PASSWORD=password_anda
Tidak perlu ubah konfigurasi lain. Laravel sudah punya driver PostgreSQL bawaan.
Perbedaan Sintaks Migration
Sebagian besar sintaks migration sama antara MySQL dan PostgreSQL. Perbedaan utama ada di beberapa tipe data:
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->decimal('price', 10, 2);
// PostgreSQL: pakai jsonb, bukan json biasa
$table->jsonb('metadata')->nullable();
// PostgreSQL: UUID native
$table->uuid('external_id')->unique();
// Enum di PostgreSQL butuh cast berbeda
$table->string('status')->default('active');
$table->timestamps();
});
Tips: Di PostgreSQL, pakai
jsonbdaripadajson. JSONB disimpan dalam format binary yang lebih efisien untuk query dan indexing.
Query JSON dengan PostgreSQL
PostgreSQL punya operator JSON yang sangat powerful. Di Laravel, Anda bisa pakai operator -> dan ->> langsung di Eloquent:
// Cari produk berdasarkan field di dalam JSON
$products = Product::where('metadata->category', 'elektronik')->get();
// Atau dengan whereJsonContains
$products = Product::whereJsonContains('metadata->tags', 'promo')->get();
// Query nested JSON
$products = Product::where('metadata->specs->weight', '>', 500)->get();
Contoh migration dengan index JSONB:
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->jsonb('metadata')->nullable();
$table->timestamps();
});
// Tambah index GIN untuk performa query JSONB
DB::statement('CREATE INDEX products_metadata_gin ON products USING GIN (metadata jsonb_path_ops)');
Full-Text Search
PostgreSQL punya full-text search bawaan yang bisa langsung dipakai tanpa plugin tambahan:
// Migration: tambah kolom tsvector
$table->tsvector('search_vector')->nullable();
// Isi kolom tsvector saat insert/update
DB::statement("
UPDATE articles
SET search_vector = to_tsvector('indonesian', coalesce(title, '') || ' ' || coalesce(content, ''))
");
// Query full-text search
$results = Article::whereRaw(
"search_vector @@ plainto_tsquery('indonesian', ?)",
[$keyword]
)->get();
Untuk proyek besar, buat trigger PostgreSQL agar search_vector otomatis diperbarui saat data berubah.
UUID sebagai Primary Key
PostgreSQL mendukung UUID natively. Cara pakai di Laravel 12:
Schema::create('orders', function (Blueprint $table) {
$table->uuid('id')->primary()->default(DB::raw('gen_random_uuid()'));
$table->string('status');
$table->timestamps();
});
Di model:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentConcernsHasUuids;
class Order extends Model
{
use HasUuids;
}
Transaksi dan Savepoint
PostgreSQL mendukung nested transaction lewat savepoint. Di Laravel ini otomatis dipakai saat Anda nested DB::transaction():
DB::transaction(function () {
$order = Order::create([...]);
DB::transaction(function () use ($order) {
// Ini pakai savepoint di PostgreSQL
// Kalau gagal, hanya bagian ini yang di-rollback
foreach ($order->items as $item) {
Inventory::decrement($item->product_id, $item->qty);
}
});
$order->update(['status' => 'confirmed']);
});
Koneksi Multiple Database
Kalau Anda pakai MySQL dan PostgreSQL bersamaan, tambahkan konfigurasi di config/database.php:
'connections' => [
'mysql' => [
'driver' => 'mysql',
// ...
],
'pgsql' => [
'driver' => 'pgsql',
'host' => env('PGSQL_HOST', '127.0.0.1'),
'port' => env('PGSQL_PORT', '5432'),
'database' => env('PGSQL_DATABASE'),
'username' => env('PGSQL_USERNAME'),
'password' => env('PGSQL_PASSWORD'),
],
],
Di model, tentukan koneksi yang dipakai:
class AnalyticsEvent extends Model
{
protected $connection = 'pgsql';
}
Baca Juga
- Migration di Laravel: Panduan Lengkap dengan Contoh Kode
- Routing di Laravel: Panduan Lengkap dengan Contoh Kode
Butuh tim yang berpengalaman setup aplikasi Laravel dengan PostgreSQL di production? Lihat layanan pengembangan aplikasi kami.
Artikel Lainnya di Kategori Laravel
9 November 2025
Notification di Laravel 12: Email, Database, dan Channel Kustom
Hampir semua aplikasi web butuh notifikasi: konfirmasi order, reset password, atau pemberitahuan saat ada komentar baru. Laravel punya sistem notifikasi yang cukup fleksibel: satu kelas bisa kirim ke email, database, Slack, dan channel lain sekaligus. Artikel ini membahas cara kerja notification di Laravel 12, mulai dari membuat kelas notifikasi, kirim via email dan database, sampai […]
Baca Artikel9 November 2025
Perbedaan Laravel Volt dan Laravel Breeze: Kapan Pakai Yang Mana?
Saat mulai proyek Laravel baru, salah satu pertanyaan yang sering muncul adalah: pakai Breeze atau Volt? Keduanya dari ekosistem Laravel, tapi perannya sangat berbeda. Artikel ini menjelaskan perbedaan Laravel Volt dan Laravel Breeze, bukan untuk memilih yang “lebih baik”, tapi untuk memahami kapan masing-masing dipakai. Laravel Breeze: Starter Kit Autentikasi Laravel Breeze adalah starter kit […]
Baca Artikel
Laravel 9 November 2025
Membuat Controller di Laravel 12: Resource, API, dan Best Practice
Controller adalah salah satu komponen paling sering ditulis di Laravel. Hampir setiap fitur butuh controller: dari menampilkan halaman, menyimpan data form, sampai mengembalikan JSON untuk API. Artikel ini membahas cara membuat controller di Laravel 12: dari controller dasar, resource controller, sampai best practice yang dipakai tim profesional. Membuat Controller Baru Gunakan perintah Artisan: php artisan […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel