3 - Database & Eloquent ORM
Author: Muhammad Irza Arifin (@rifinsra_05)
Pada bagian ini, kita akan membahas interaksi dengan database di Laravel, khususnya menggunakan Eloquent ORM (Object-Relational Mapping). Eloquent ORM adalah fitur powerful di Laravel yang memungkinkan Kamu untuk berinteraksi dengan database menggunakan sintaks PHP yang elegan dan intuitif, tanpa perlu menulis query SQL secara manual.
Konfigurasi Database
Langkah pertama dalam menggunakan database di Laravel adalah mengkonfigurasi koneksi database. Konfigurasi database disimpan di file .env yang berada di root project Laravel.
Contoh Konfigurasi Database (MySQL):
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=username_database
DB_PASSWORD=password_database
Penjelasan:
DB_CONNECTION: Tipe database (mysql, pgsql, sqlite, sqlsrv).DB_HOST: Alamat host database.DB_PORT: Port database.DB_DATABASE: Nama database.DB_USERNAME: Username untuk koneksi database.DB_PASSWORD: Password untuk koneksi database.
Konfigurasi Lanjutan:
Kamu juga dapat mengkonfigurasi opsi lanjutan seperti charset, collation, dan prefix tabel di file config/database.php.
Migrasi
Migrasi adalah cara untuk mengelola struktur database Kamu menggunakan kode PHP. Migrasi memungkinkan Kamu untuk membuat, memodifikasi, dan menghapus tabel database dengan mudah dan terstruktur, tanpa perlu menulis query SQL secara manual.
Membuat Migrasi:
Kamu dapat membuat migrasi baru menggunakan Artisan command:
php artisan make:migration create_users_table
Contoh Migrasi:
// database/migrations/timestamp_create_users_table.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('users', function (Blueprint $table) {
```php
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
}
};
Penjelasan Kode:
Schema::create('users', ...): Membuat tabel baru bernamausers.$table->id();: Menambahkan kolomidsebagai primary key auto-increment.$table->string('name');: Menambahkan kolomnamebertipe string.$table->string('email')->unique();: Menambahkan kolomemailbertipe string dan unique.$table->timestamp('email_verified_at')->nullable();: Menambahkan kolomemail_verified_atbertipe timestamp dan nullable.$table->string('password');: Menambahkan kolompasswordbertipe string.$table->rememberToken();: Menambahkan kolomremember_tokenuntuk fitur “remember me”.$table->timestamps();: Menambahkan kolomcreated_atdanupdated_atuntuk menyimpan timestamp.Schema::dropIfExists('users');: Menghapus tabelusers(digunakan saat rollback migrasi).
Menjalankan Migrasi:
Untuk menjalankan migrasi, gunakan perintah berikut:
php artisan migrate
Rollback Migrasi:
Untuk membatalkan migrasi terakhir, gunakan perintah:
php artisan migrate:rollback
Best Practices Migrasi:
- Gunakan nama migrasi yang deskriptif.
- Pisahkan migrasi menjadi file-file kecil untuk memudahkan pengelolaan.
- Gunakan
php artisan migrate:freshuntuk menghapus semua tabel dan menjalankan migrasi dari awal (hati-hati!).
Seeder dan Factory
Seeder digunakan untuk mengisi database dengan data awal. Seeder berguna untuk mengisi database dengan data dummy untuk keperluan development atau testing.
Membuat Seeder:
php artisan make:seeder UserSeeder
Contoh Seeder:
// database/seeders/UserSeeder.php
use Illuminate\Database\Seeder;
use App\Models\User;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
User::create([
'name' => 'John Doe',
'email' => 'john.doe@example.com',
'password' => bcrypt('password'),
]);
// Tambahkan data user lainnya...
}
}
Menjalankan Seeder:
php artisan db:seed --class=UserSeeder
Factory:
Factory digunakan untuk membuat data dummy secara mudah dan cepat. Factory memungkinkan Kamu untuk mendefinisikan blueprint untuk model dan meng-generate data dummy berdasarkan blueprint tersebut.
Membuat Factory:
php artisan make:factory UserFactory --model=User
Contoh Factory:
// database/factories/UserFactory.php
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5by9cq/uSwcorpwZjroozlClIt/Io6efp4xqCxK', // password
'remember_token' => Str::random(10),
];
}
/**
* Indicate that the model's email address should be unverified.
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
Menggunakan Factory di Seeder:
// database/seeders/UserSeeder.php
use Illuminate\Database\Seeder;
use App\Models\User;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
User::factory()->count(10)->create();
}
}
Penjelasan Kode:
User::factory()->count(10)->create();: Membuat 10 data user dummy menggunakan factory.
Eloquent ORM
Eloquent ORM adalah fitur powerful di Laravel yang memungkinkan Kamu untuk berinteraksi dengan database menggunakan objek PHP. Setiap tabel database direpresentasikan oleh sebuah model Eloquent.
Membuat Model:
php artisan make:model User
Contoh Model:
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory;
protected $fillable = [
'name',
'email',
'password',
];
}
Penjelasan Kode:
protected $fillable = [...]: Mendefinisikan kolom-kolom yang boleh diisi secara massal.
Query Database dengan Eloquent:
Eloquent menyediakan berbagai method untuk melakukan query database, seperti:
all(): Mengambil semua data dari tabel.find($id): Mencari data berdasarkan ID.where('kolom', 'operator', 'nilai'): Mencari data berdasarkan kondisi tertentu.orderBy('kolom', 'asc/desc'): Mengurutkan data.first(): Mengambil data pertama yang cocok dengan kondisi.get(): Mengambil collection data yang cocok dengan kondisi.
Contoh Query:
// Mengambil semua user
$users = User::all();
// Mencari user dengan ID 1
$user = User::find(1);
// Mencari user dengan email 'john.doe@example.com'
$user = User::where('email', 'john.doe@example.com')->first();
// Mengambil user yang namanya diawali dengan 'John' dan diurutkan berdasarkan nama secara ascending
$users = User::where('name', 'like', 'John%')->orderBy('name', 'asc')->get();
Relasi:
Eloquent juga mendukung relasi antar tabel database, seperti one-to-one, one-to-many, dan many-to-many.
Kesimpulan:
Pada bagian ini, kita telah membahas interaksi dengan database di Laravel menggunakan Eloquent ORM, termasuk konfigurasi database, migrasi, seeder, factory, dan query database. Eloquent ORM memudahkan Kamu dalam mengelola dan berinteraksi dengan database, sehingga Kamu dapat fokus pada logika bisnis aplikasi.
Langkah Selanjutnya:
Pada bagian selanjutnya, kita akan membangun aplikasi web sederhana dengan operasi CRUD (Create, Read, Update, Delete) untuk mempraktekkan konsep-konsep yang telah dipelajari sejauh ini 🎉🎉