Database & Migration

Mengatur koneksi database, membuat tabel dengan migration, tipe kolom, relasi foreign key, dan menjalankan/rollback.

Part 9 dari 26 ± 45 menit Gratis

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

MethodHasil
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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X