Kembali ke Artikel
9 November 2025
vandyahmad24
Diperbarui: 18 April 2026

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 jsonb daripada json. 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

Butuh tim yang berpengalaman setup aplikasi Laravel dengan PostgreSQL di production? Lihat layanan pengembangan aplikasi kami.

Tag: #laravel #php #tutorial
BACA JUGA

Artikel Lainnya di Kategori Laravel

Laravel

10 November 2025

Contoh Penggunaan Concurrency di Laravel 12: Dashboard, API Paralel, dan Defer

Artikel sebelumnya membahas konsep Concurrency di Laravel 12. Artikel ini fokus pada implementasi: studi kasus nyata bagaimana Concurrency bisa mempercepat aplikasi secara signifikan. Studi Kasus 1: Dashboard dengan Banyak Data Source Dashboard admin yang butuh data dari beberapa tabel berbeda. Ini biasanya jadi bottleneck karena diquery satu per satu. Sebelum (sequential — sekitar 800ms): public […]

Baca Artikel
Laravel

10 November 2025

Cara Membuat Custom Artisan Command di Laravel 12

Artisan bawaan Laravel sudah mencakup banyak kebutuhan. Tapi kadang Anda butuh command yang spesifik untuk proyek Anda, misalnya generate laporan harian, kirim email batch, atau sync data dari API eksternal. Di sinilah custom Artisan command berguna. Artikel ini menunjukkan cara membuat, mengatur parameter, dan menjalankan scheduled command di Laravel 12. Membuat Custom Command Gunakan Artisan […]

Baca Artikel
laravel Laravel

9 November 2025

Routing di Laravel: Panduan Lengkap dengan Contoh Kode

Routing adalah pintu masuk semua request di Laravel. Sebelum request sampai ke controller atau logika apapun, dia harus melewati router dulu. Memahami cara kerja routing akan membuat kamu lebih mudah membangun struktur aplikasi yang rapi dan mudah di-maintain. Konsep Dasar: Bagaimana Request Diproses Saat browser mengirim request ke GET /posts, Laravel membaca file routes/web.php, mencari […]

Baca Artikel

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel