Panduan Laravel

Belajar Laravel Batch 4: Database, Migration, dan Model - Mengelola Data Aplikasi

Belajar Laravel Batch 4: Database, Migration, dan Model - Mengelola Data Aplikasi
Twitter / X WhatsApp Facebook LinkedIn Telegram
Apa yang kamu butuhkan

Di Batch 4 ini, PahamITian akan menyelami dunia database di Laravel. Kita akan belajar bagaimana Laravel mempermudah pengelolaan database dengan Migration untuk membuat tabel dan Eloquent Model untuk berinteraksi dengan data, termasuk menyimpan, mengambil, dan mengubahnya.

Halo, PahamITian! Selamat datang kembali di petualangan Laravel kita! Setelah di Batch 1 kita berkenalan dengan Laravel, di Batch 2 kita sudah jago mengatur alur aplikasi dengan Routing dan mempercantik tampilan dengan Blade, dan di Batch 3 kita sudah bisa berinteraksi dengan pengguna lewat Controller dan Form. Sekarang, saatnya kita masuk ke "jantung" sebuah aplikasi web yang dinamis: Database.

Tanpa database, aplikasi kita hanya bisa menampilkan data statis atau data yang hilang setiap kali halaman di-refresh. Di Batch 4 ini, kita akan belajar bagaimana Laravel mempermudah kita dalam mengelola database dengan dua fitur andalannya: Migration dan Eloquent Model.

Mari kita mulai!

1. Konsep Migration: "Version Control" untuk Database Kita

Pernahkah PahamITian membayangkan bagaimana jika kita bekerja dalam tim dan setiap orang mengubah struktur database secara manual? Pasti kacau, kan? Nah, di sinilah Migration berperan!

Migration di Laravel adalah seperti "version control" untuk skema database kita. Dengan migration, kita bisa membuat, mengubah, atau menghapus tabel database menggunakan kode PHP, bukan SQL manual. Ini punya banyak keuntungan:

  • Konsisten: Semua anggota tim memiliki struktur database yang sama.
  • Terlacak: Kita bisa melihat riwayat perubahan skema database.
  • Mudah Di-rollback: Jika ada kesalahan, kita bisa dengan mudah mengembalikan perubahan.
  • Database Agnostic: Kode migration kita bisa bekerja di berbagai jenis database (MySQL, PostgreSQL, SQLite, dll.) tanpa perlu mengubah kode.

Cara Membuat Migration

Untuk membuat file migration baru, kita pakai perintah Artisan:

BASH
php artisan make:migration create_posts_table

Perintah di atas akan membuat file baru di folder database/migrations dengan nama seperti 2023_10_27_123456_create_posts_table.php. Angka di depan adalah timestamp yang menunjukkan kapan migration itu dibuat.

Struktur File Migration

Setiap file migration memiliki dua metode utama:

  • up(): Metode ini akan dijalankan saat kita menjalankan migration (php artisan migrate). Di sinilah kita mendefinisikan perubahan yang ingin kita lakukan pada database (misalnya, membuat tabel baru).
  • down(): Metode ini akan dijalankan saat kita me-rollback migration (php artisan migrate:rollback). Di sinilah kita mendefinisikan cara "mengembalikan" perubahan yang dilakukan oleh metode up(). Jika up() membuat tabel, down() akan menghapus tabel tersebut.

Contoh struktur dasar:

PHP
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id(); // Kolom ID (primary key, auto-increment)
            $table->string('title'); // Kolom string untuk judul
            $table->text('content'); // Kolom text untuk isi artikel
            $table->timestamps(); // Kolom created_at dan updated_at otomatis
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts'); // Hapus tabel posts jika di-rollback
    }
};

Di dalam Schema::create(), kita menggunakan objek Blueprint untuk mendefinisikan kolom-kolom tabel. Beberapa tipe kolom yang sering digunakan:

  • $table->id(): Membuat kolom id (BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY).
  • $table->string('nama_kolom'): Kolom string (VARCHAR).
  • $table->text('nama_kolom'): Kolom teks panjang.
  • $table->integer('nama_kolom'): Kolom integer.
  • $table->boolean('nama_kolom'): Kolom boolean (TINYINT(1)).
  • $table->timestamp('nama_kolom'): Kolom timestamp.
  • $table->timestamps(): Membuat dua kolom created_at dan updated_at secara otomatis, yang akan diisi oleh Laravel saat data dibuat atau diubah.

Menjalankan Migration

Setelah membuat file migration, kita perlu menjalankannya agar perubahan diterapkan ke database. Pastikan PahamITian sudah mengkonfigurasi koneksi database di file .env (biasanya di Batch 1 kita sudah siapkan).

BASH
php artisan migrate

Perintah ini akan menjalankan semua migration yang belum pernah dijalankan.

Me-rollback Migration

Jika PahamITian melakukan kesalahan atau ingin mengembalikan perubahan migration terakhir, gunakan:

BASH
php artisan migrate:rollback

Ini akan menjalankan metode down() dari migration terakhir yang dijalankan.

2. Model Eloquent: Jembatan Antara Kode dan Database

Setelah kita punya tabel di database, bagaimana cara kita berinteraksi dengannya dari kode PHP? Di sinilah Eloquent ORM (Object-Relational Mapper) datang membantu. Eloquent adalah salah satu fitur paling powerful di Laravel.

Model Eloquent adalah representasi dari tabel database kita dalam bentuk kelas PHP. Setiap instance dari sebuah model biasanya mewakili satu baris (record) di tabel tersebut. Dengan Eloquent, kita bisa berinteraksi dengan database menggunakan sintaks PHP yang elegan, tanpa perlu menulis query SQL mentah!

Cara Membuat Model

Untuk membuat model baru, kita pakai perintah Artisan:

BASH
php artisan make:model Post

Perintah ini akan membuat file app/Models/Post.php. Secara default, Laravel akan mengasumsikan bahwa model Post akan berinteraksi dengan tabel bernama posts (nama model dalam bentuk plural dan huruf kecil).

Struktur Dasar Model

PHP
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    // Properti lain bisa ditambahkan di sini
}

3. Mass Assignment dan Properti fillable / guarded

Saat kita menyimpan data ke database menggunakan model, kita seringkali ingin mengisi beberapa kolom sekaligus. Ini disebut Mass Assignment. Contoh:

PHP
Post::create([
    'title' => 'Judul Artikel Baru',
    'content' => 'Isi artikel yang sangat menarik.'
]);

Namun, mass assignment bisa menjadi celah keamanan jika tidak dikontrol. Bayangkan jika ada kolom is_admin di tabel users, dan pengguna jahat mencoba mengirimkan data ['is_admin' => true] melalui form. Ini bisa membuat mereka menjadi admin!

Untuk mencegah ini, Laravel melindungi kita dengan mengharuskan kita secara eksplisit mendefinisikan kolom mana saja yang boleh diisi melalui mass assignment. Kita bisa menggunakan properti fillable atau guarded di model kita.

  • $fillable: Array yang berisi nama-nama kolom yang boleh diisi melalui mass assignment.
  • $guarded: Array yang berisi nama-nama kolom yang tidak boleh diisi melalui mass assignment. Jika guarded diisi dengan [] (array kosong), berarti semua kolom boleh diisi (hati-hati dengan ini!).

Lebih disarankan menggunakan $fillable karena lebih aman (whitelist).

Contoh di model Post.php:

PHP
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'content']; // Hanya kolom title dan content yang boleh diisi mass assignment
}

4. Query Dasar dengan Eloquent

Sekarang kita punya model Post dan tabel posts. Mari kita lihat bagaimana cara berinteraksi dengan data menggunakan Eloquent.

Mengambil Semua Data (all())

Untuk mengambil semua artikel dari tabel posts:

PHP
use App\Models\Post;

$posts = Post::all(); // Mengambil semua data dari tabel posts

foreach ($posts as $post) {
    echo $post->title . "\n";
}

Mengambil Data Berdasarkan ID (find())

Untuk mengambil satu artikel berdasarkan primary key (ID):

PHP
use App\Models\Post;

$post = Post::find(1); // Mengambil artikel dengan ID 1

if ($post) {
    echo $post->title;
} else {
    echo "Artikel tidak ditemukan.";
}

Membuat Data Baru (create())

Untuk menyimpan artikel baru ke database:

PHP
use App\Models\Post;

$newPost = Post::create([
    'title' => 'Judul Artikel Baru dari Eloquent',
    'content' => 'Isi lengkap artikel ini.'
]);

echo "Artikel '" . $newPost->title . "' berhasil dibuat dengan ID: " . $newPost->id;

Ingat, create() hanya akan berhasil jika kolom-kolom yang diisi ada di properti $fillable model kita.

Mengupdate Data (update())

Untuk mengubah data artikel yang sudah ada:

PHP
use App\Models\Post;

$post = Post::find(1); // Ambil artikel dengan ID 1

if ($post) {
    $post->update([
        'title' => 'Judul Artikel Diperbarui',
        'content' => 'Konten artikel juga diperbarui.'
    ]);
    echo "Artikel '" . $post->title . "' berhasil diperbarui.";
} else {
    echo "Artikel tidak ditemukan.";
}

Menghapus Data (delete())

Untuk menghapus artikel dari database:

PHP
use App\Models\Post;

$post = Post::find(1); // Ambil artikel dengan ID 1

if ($post) {
    $post->delete();
    echo "Artikel '" . $post->title . "' berhasil dihapus.";
} else {
    echo "Artikel tidak ditemukan.";
}

Latihan Praktik: Membuat Tabel Posts dan Menyimpan Artikel

Mari kita terapkan semua yang sudah kita pelajari untuk membuat tabel posts dan menyimpan artikel dari form yang sudah kita buat di Batch 3.

Langkah 1: Konfigurasi Database (Verifikasi)

Pastikan file .env PahamITian sudah dikonfigurasi dengan benar untuk koneksi database. Contoh untuk MySQL:

DOTENV
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database_kamu
DB_USERNAME=root
DB_PASSWORD=

Buat database baru di MySQL/phpMyAdmin dengan nama yang sama dengan DB_DATABASE.

Langkah 2: Membuat Migration untuk Tabel posts

Jalankan perintah ini di terminal:

BASH
php artisan make:migration create_posts_table

Edit file migration yang baru dibuat (misal: database/migrations/2023_10_27_xxxxxx_create_posts_table.php). Tambahkan kolom title dan content:

PHP
// ... (bagian atas file)

class CreatePostsTable extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Langkah 3: Jalankan Migration

BASH
php artisan migrate

Sekarang, cek database PahamITian. Seharusnya sudah ada tabel posts.

Langkah 4: Membuat Model Post

Jalankan perintah ini:

BASH
php artisan make:model Post

Edit file app/Models/Post.php dan tambahkan $fillable:

PHP
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'content'];
}

Langkah 5: Mengubah Controller untuk Menyimpan Data

Buka app/Http/Controllers/ArticleController.php (atau controller yang PahamITian gunakan untuk form artikel). Ubah metode store() (atau metode yang menerima data POST dari form) agar menyimpan data ke database menggunakan model Post.

PHP
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post; // Import model Post

class ArticleController extends Controller
{
    public function create()
    {
        return view('articles.create');
    }

    public function store(Request $request)
    {
        // Validasi input (akan kita bahas lebih detail nanti)
        $validatedData = $request->validate([
            'title' => 'required|max:255',
            'content' => 'required',
        ]);

        // Simpan data ke database menggunakan model Post
        Post::create($validatedData);

        // Redirect dengan flash message
        return redirect('/articles/create')->with('success', 'Artikel berhasil disimpan!');
    }
}

Langkah 6: Coba Isi Form

Buka form artikel PahamITian di browser, isi judul dan konten, lalu submit. Jika berhasil, PahamITian akan melihat flash message "Artikel berhasil disimpan!". Cek database PahamITian, seharusnya sudah ada data artikel baru di tabel posts!

Selamat, PahamITian! PahamITian baru saja berhasil berinteraksi dengan database menggunakan Laravel Migration dan Eloquent Model!


Ringkasan Singkat Batch 4

Di Batch 4 ini, kita sudah belajar:

  • Migration: Alat untuk mengelola skema database secara terstruktur dan version-controlled.
  • Eloquent Model: Representasi tabel database dalam kode PHP, mempermudah interaksi dengan data.
  • Mass Assignment: Cara mengisi banyak kolom sekaligus, dan pentingnya $fillable atau $guarded untuk keamanan.
  • Query Dasar Eloquent: Cara mengambil (all(), find()), membuat (create()), mengupdate (update()), dan menghapus (delete()) data.

Pertanyaan Cek Pemahaman

  1. Apa fungsi utama dari Laravel Migration dan mengapa penting menggunakannya?
  2. Jelaskan perbedaan antara metode up() dan down() dalam sebuah file migration!
  3. Apa itu Eloquent Model dan bagaimana hubungannya dengan tabel di database?
  4. Mengapa properti $fillable atau $guarded sangat penting dalam model Eloquent?
  5. Bagaimana cara mengambil semua data dari sebuah tabel menggunakan Eloquent?

Kesalahan Umum Pemula

  • Lupa php artisan migrate: Setelah membuat atau mengubah file migration, selalu ingat untuk menjalankan php artisan migrate agar perubahan diterapkan ke database.
  • Konfigurasi .env salah: Pastikan detail koneksi database di .env sudah benar dan database sudah dibuat.
  • Tidak menambahkan $fillable: Ini adalah kesalahan umum saat menggunakan create() atau update() dengan mass assignment. Laravel akan menolak menyimpan data jika kolom yang diisi tidak ada di $fillable (atau tidak diizinkan oleh $guarded).
  • Nama model dan tabel tidak sesuai: Secara default, model Post akan mencari tabel posts. Jika nama tabel berbeda, PahamITian perlu mendefinisikannya secara eksplisit di model dengan properti $table (misal: protected $table = 'my_posts';).

Persiapan untuk Batch Berikutnya

Di Batch 4 ini kita sudah bisa menyimpan data. Tapi, bagaimana cara menampilkan daftar semua artikel? Atau bagaimana cara mengedit dan menghapus artikel yang sudah ada? Nah, di Batch 5 kita akan menyempurnakan kemampuan CRUD (Create, Read, Update, Delete) kita menjadi lebih lengkap dan terstruktur. Siap untuk membuat aplikasi kita semakin fungsional? Sampai jumpa di Batch 5!