Chapter Konfigurasi Database pada Section Persiapan Lingkungan Kerja sudah memperkenalkan alur dasarnya: mengatur DB_CONNECTION di .env, memakai SQLite bawaan, lalu memverifikasi koneksi dengan db:show. Lapisan .env itu sebenarnya hanya pintu masuk — seluruh logika pemilihan dan definisi koneksi database berada di berkas config/database.php. Pada chapter ini kita membedah berkas tersebut bagian demi bagian, mulai dari kunci default, array connections, sampai blok migrations yang akan menjadi catatan riwayat skema kita. Pemahaman ini menjadi bekal ketika nanti kita bekerja dengan beberapa koneksi sekaligus dan mengelola migration.
Anatomi Berkas config/database.php #
Berkas config/database.php berisi satu array PHP besar yang terbagi menjadi empat blok. Tabel berikut memetakan fungsi tiap blok:
| Blok | Fungsi |
|---|---|
default | Nama koneksi yang dipakai bila tidak ada koneksi lain yang diminta secara eksplisit |
connections | Definisi tiap koneksi: sqlite, mysql, mariadb, pgsql, dan sqlsrv |
migrations | Nama tabel pencatat migration yang sudah dijalankan |
redis | Koneksi Redis untuk cache dan session |
Blok pertama yang kita temui hanya satu baris:
'default' => env('DB_CONNECTION', 'sqlite'),Panggilan env('DB_CONNECTION', 'sqlite') membaca variabel DB_CONNECTION dari berkas .env dan memakai 'sqlite' sebagai nilai cadangan bila variabel tersebut tidak didefinisikan. Nilai hasil pembacaan itu lalu dipakai sebagai kunci untuk mencari entri bernama sama di array connections. Karena berkas .env proyek kita berisi DB_CONNECTION=sqlite, koneksi aktif aplikasi adalah entri sqlite — persis alur yang sudah kita amati di Section Persiapan Lingkungan Kerja, kini dilihat dari dalam berkas konfigurasinya.
Array connections dan Lima Driver Siap Pakai #
Entri sqlite pada skeleton Laravel 13 terlihat seperti berikut, diambil langsung dari berkas config/database.php proyek latihan kita:
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DB_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
'busy_timeout' => null,
'journal_mode' => null,
'synchronous' => null,
'transaction_mode' => 'DEFERRED',
],Mari kita bedah baris-baris pentingnya. Kunci driver menentukan driver PDO yang dipakai — inilah yang membuat Laravel tahu cara berbicara dengan SQLite dan bukan MySQL. Kunci database berisi jalur berkas database/database.sqlite yang dibuat otomatis saat php artisan migrate pertama, sebagaimana yang sudah kita saksikan pada chapter persiapan. Kunci foreign_key_constraints mengaktifkan pemeriksaan foreign key bawaan SQLite, sedangkan empat kunci terakhir (busy_timeout, journal_mode, synchronous, transaction_mode) adalah pengaturan perilaku khusus SQLite yang boleh kita biarkan nilainya.
Definisi mysql di berkas yang sama mengikuti pola serupa:
'mysql' => [
'driver' => 'mysql',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
// ... charset, collation, dan opsi SSL lainnya
],Berkat pola env() ini, nilai tiap kunci koneksi diambil dari .env dengan nilai cadangan yang tertulis di config/database.php. Tabel berikut memetakan variabel .env ke kunci koneksi mysql:
Variabel .env | Kunci koneksi yang terisi |
|---|---|
DB_HOST | host |
DB_PORT | port |
DB_DATABASE | database |
DB_USERNAME | username |
DB_PASSWORD | password |
Konsekuensinya penting: beralih dari SQLite ke MySQL atau PostgreSQL tidak menyentuh config/database.php sama sekali — kita cukup mengganti nilai DB_CONNECTION beserta variabel DB_* di .env, seperti contoh MySQL dan PostgreSQL pada chapter Konfigurasi Database di Section Persiapan Lingkungan Kerja. Daftar lengkap opsi tiap driver, dari charset MySQL sampai search_path PostgreSQL, terdokumentasi di dokumentasi database
. Definisi koneksi yang tidak terpilih tetap dibiarkan diam; Laravel hanya membuka koneksi saat benar-benar dipakai.
Membaca Kondisi Database dengan db:show #
Perintah db:show yang sudah kita kenal sebenarnya adalah cerminan langsung konfigurasi di atas. Jalankan kembali perintah tersebut:
php artisan db:showOutput yang Dihasilkan:
SQLite .............................................................. 3.45.2
Connection .......................................................... sqlite
Database .......................................... database/database.sqlite
Host .......................................................................
Port .......................................................................
Username .................................................................
URL .......................................................................
Open Connections ...........................................................
Tables .................................................................. 10
Schema / Table ........................................................ Size
main / cache ............................................................. —
main / cache_locks ....................................................... —
main / failed_jobs ....................................................... —
main / job_batches ....................................................... —
main / jobs .............................................................. —
main / migrations ......................................................... —
main / password_reset_tokens ............................................. —
main / personal_access_tokens ............................................ —
main / sessions .......................................................... —
main / users ............................................................. —Kali ini kita membaca baris-barisnya dari sudut pandang konfigurasi. Baris Connection ... sqlite adalah isi kunci default; baris Database ... database/database.sqlite adalah hasil kunci database pada entri connections.sqlite. Kolom Host, Port, dan Username kosong karena SQLite memang tidak berjalan sebagai server — tidak ada jaringan maupun autentikasi yang perlu dilaporkan. Daftar tabel di bagian bawah adalah hasil migrasi bawaan Laravel ditambah tabel personal_access_tokens milik Sanctum pada proyek latihan ini.
Config Caching untuk Produksi #
Pada lingkungan produksi, membaca berkas .env pada setiap request adalah pemborosan waktu. Laravel menyediakan perintah untuk menggabungkan seluruh berkas config/*.php menjadi satu berkas PHP yang dimuat sekali:
php artisan config:cacheOutput yang Dihasilkan:
INFO Configuration cached successfully.Cache tersebut tersimpan di bootstrap/cache/config.php dan dimuat otomatis pada request berikutnya. Konsekuensinya perlu dipahami dengan seksama:
Untuk menghapus cache dan kembali membaca .env, jalankan:
php artisan config:clearOutput yang Dihasilkan:
INFO Configuration cache cleared successfully.Blok migrations pada config/database.php — satu-satunya pengaturannya adalah nama tabel pencatat migration — akan mulai terasa hidup pada chapter-chapter berikutnya, karena di sanalah Laravel menyimpan riwayat skema kita. Namun sebelum masuk ke migration, kita perlu menyempurnakan satu keterampilan: memakai lebih dari satu koneksi dalam satu aplikasi. Itulah bahasan chapter Database Connections.