Database & Migration
Mengatur koneksi database, membuat tabel dengan migration, tipe kolom, relasi foreign key, dan menjalankan/rollback.
Konfigurasi database
Laravel mendukung SQLite, MySQL, MariaDB, PostgreSQL, dan SQL Server. Pengaturan ada di .env:
# Paling mudah untuk belajar (bawaan proyek baru): SQLite — satu berkas database/database.sqlite
DB_CONNECTION=sqlite
# MySQL
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=toko
DB_USERNAME=root
DB_PASSWORD=
Migration: version control untuk skema database
Alih-alih mengetik CREATE TABLE manual, kamu menulis migration: kelas PHP yang mendeskripsikan perubahan skema, disimpan di database/migrations dan dijalankan berurutan. Keuntungan: skema ikut di Git, semua anggota tim memiliki database yang sama, dan perubahan bisa dibatalkan.
php artisan make:migration create_produks_table
php artisan make:model Produk -m # model + migration sekaligus
Anatomi migration
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void // dijalankan saat migrate
{
Schema::create('produks', function (Blueprint $table) {
$table->id();
$table->foreignId('kategori_id')->constrained()->cascadeOnDelete();
$table->string('nama', 100);
$table->string('slug')->unique();
$table->text('deskripsi')->nullable();
$table->unsignedInteger('harga');
$table->unsignedInteger('stok')->default(0);
$table->boolean('aktif')->default(true);
$table->timestamps();
$table->softDeletes();
$table->index(['aktif', 'harga']);
});
}
public function down(): void // dijalankan saat rollback
{
Schema::dropIfExists('produks');
}
};
Class anonim (return new class extends Migration) adalah gaya bawaan Laravel modern.
Tipe kolom yang sering dipakai
| Method | Hasil |
|---|---|
id() | Kunci utama auto-increment (bigint unsigned) |
string('nama', 100) | VARCHAR |
text(), longText() | Teks panjang |
integer(), unsignedInteger(), bigInteger() | Bilangan bulat |
decimal('harga', 12, 2) | Desimal presisi (uang) |
boolean() | true/false |
date(), dateTime(), timestamp() | Tanggal/waktu |
json() | Data JSON |
enum('status', [...]) | Pilihan tetap |
timestamps() | created_at & updated_at |
softDeletes() | deleted_at (penghapusan lunak) |
Pengubah kolom
nullable(), default($nilai), unique(), index(), unsigned(), after('kolom') (MySQL), comment('...').
Foreign key
$table->foreignId('kategori_id')->constrained()->cascadeOnDelete();
// setara dengan: kolom bigint unsigned + foreign key ke kategoris.id,
// dan baris ikut terhapus bila kategorinya dihapus
constrained() menebak tabel dari nama kolom (kategori_id → kategoris). Variasi: nullOnDelete(), restrictOnDelete(). Pastikan tabel induk dibuat lebih dulu (nama berkas migration berurutan menurut tanggal).
Menjalankan migration
php artisan migrate # jalankan yang belum dijalankan
php artisan migrate:status # lihat status
php artisan migrate:rollback # batalkan batch terakhir
php artisan migrate:fresh --seed # hapus SEMUA tabel, migrate ulang, isi data (hanya development!)
Mengubah tabel yang sudah ada
Jangan mengedit migration lama yang sudah dijalankan di produksi. Buat migration baru: php artisan make:migration add_berat_to_produks_table lalu Schema::table('produks', fn (Blueprint $t) => $t->unsignedInteger('berat')->nullable());.
Query Builder (sekilas)
Selain Eloquent, ada DB::table('produks')->where('stok', '>', 0)->get(). Keduanya memakai query berparameter sehingga aman dari SQL injection.