Latar Belakang
Sebagai lanjutan dari pembahasan mengenai database dan migration, tahap berikutnya adalah mempelajari Eloquent ORM dan relasi data dalam Laravel. Setelah struktur tabel berhasil dibuat, diperlukan cara yang efisien untuk mengelola dan mengambil data dari database tanpa harus menuliskan query SQL secara manual. Oleh karena itu, Laravel menyediakan Eloquent ORM sebagai solusi untuk mempermudah proses interaksi dengan database.
Artikel ini dibuat dengan tujuan untuk mendokumentasikan hasil pembelajaran saya mengenai penggunaan Eloquent ORM serta penerapan relasi antar tabel. Dengan memahami konsep ini, saya dapat mengelola data secara lebih terstruktur serta membangun hubungan antar entitas dalam aplikasi dengan lebih mudah.
Pengenalan Eloquent ORM
Sebelum kita masuk ke praktik, mari pahami dulu apa itu ORM. ORM (Object-Relational Mapping) adalah jembatan yang menghubungkan antara kode program berbasis objek dengan database relasional. Setiap tabel di database akan diwakili oleh sebuah model di Laravel.
Misalnya, kita punya tabel products, maka kita akan membuat model Product. Model ini nantinya akan menjadi "gerbang" utama kita untuk berinteraksi dengan tabel products. Kita bisa mengambil data, menambah data baru, mengupdate, atau menghapus data hanya dengan memanggil method-method dari model tersebut.
Kelebihan Eloquent dibanding query manual:
Lebih mudah dibaca - Kode kita jadi lebih bersih dan ekspresif
Keamanan lebih terjamin - Eloquent secara otomatis melindungi dari serangan SQL injection
Menghemat waktu - Tidak perlu menulis query berulang-ulang
Hubungan antar data lebih mudah - Relasi bisa didefinisikan sekali dan dipakai berulang kali
Contoh sederhana perbandingan:
// Menggunakan query manual
DB::select("SELECT * FROM products WHERE price > 100000");
// Menggunakan Eloquent
Product::where('price', '>', 100000)->get();
Membuat Model
Untuk membuat model di Laravel, kita bisa menggunakan perintah Artisan. Buka terminal atau command prompt, lalu jalankan:
php artisan make:model Product
Perintah ini akan membuat file baru di direktori app/Models/Product.php. Secara otomatis, Laravel akan mengasumsikan bahwa model Product terhubung dengan tabel products (nama jamak dari nama model). Ini adalah konvensi yang memudahkan, tapi kita juga bisa menentukan nama tabel sendiri jika diperlukan.
Mari kita lihat contoh model Product sederhana:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $table = 'products';
protected $primaryKey = 'id';
protected $fillable = ['name', 'price', 'stock', 'category_id'];
}
Penjelasan kode di atas:
$table : menentukan nama tabel yang terhubung dengan model ini
$primaryKey : menentukan primary key tabel (defaultnya 'id')
$fillable : daftar kolom yang boleh diisi secara massal (keamanan)
Operasi Dasar Menggunakan Eloquent
Setelah model siap, kita bisa mulai berinteraksi dengan database. Biasanya operasi-operasi ini dilakukan di dalam controller. Berikut contoh-contoh dasarnya:
Mengambil Data
// Di dalam controller
use App\Models\Product;
// Ambil semua data produk
$products = Product::all();
// Ambil produk dengan harga > 100000
$expensiveProducts = Product::where('price', '>', 100000)->get();
// Ambil satu produk berdasarkan ID
$product = Product::find(1);
Menambahkan Data
// Cara 1: Menggunakan create (mass assignment)
Product::create([
'name' => 'Laptop Gaming',
'price' => 15000000,
'stock' => 10
]);
// Cara 2: Membuat objek lalu save
$product = new Product();
$product->name = 'Mouse Wireless';
$product->price = 250000;
$product->stock = 50;
$product->save();
Mengupdate Data
// Cari produk lalu update
$product = Product::find(1);
$product->price = 14000000;
$product->save();
// Atau update langsung
Product::where('id', 1)->update(['stock' => 5]);
Menghapus Data
// Hapus berdasarkan ID
$product = Product::find(1);
$product->delete();
// Hapus langsung
Product::destroy(1);
Konsep Relasi Data
Dalam aplikasi nyata, data tidak pernah berdiri sendiri. Misalnya, kita punya produk dan kategori. Setiap produk pasti masuk ke dalam satu kategori, dan satu kategori bisa memiliki banyak produk. Nah, di sinilah kita butuh relasi data.
Relasi data memungkinkan kita menghubungkan antar tabel sehingga pengelolaan data jadi lebih terstruktur dan efisien. Tiga jenis relasi yang paling umum:
One to Many : Satu record di tabel A bisa berhubungan dengan banyak record di tabel B
Many to One : Kebalikan dari one to many, banyak record di tabel B dimiliki oleh satu record di tabel A
Many to Many : Banyak record di tabel A berhubungan dengan banyak record di tabel B
Dalam artikel ini, kita akan fokus pada one-to-many dan many-to-one karena ini adalah fondasi penting sebelum masuk ke relasi yang lebih kompleks.
Relasi One-to-Many di Eloquent
Mari kita gunakan contoh nyata: Kategori dan Produk. Satu kategori bisa memiliki banyak produk, dan satu produk hanya bisa dimiliki oleh satu kategori.
Model Kategori
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $fillable = ['name', 'description'];
// Relasi one-to-many: satu kategori punya banyak produk
public function products()
{
return $this->hasMany(Product::class);
}
}
Model Product
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'price', 'stock', 'category_id'];
// Relasi many-to-one: satu produk dimiliki oleh satu kategori
public function category()
{
return $this->belongsTo(Category::class);
}
}
Penjelasan relasi:
hasMany() : method ini memberitahu Laravel bahwa model Category terhubung dengan model Product melalui foreign key category_id di tabel products
belongsTo() : method ini memberitahu Laravel bahwa model Product terhubung dengan model Category, dan setiap produk punya satu kategori
Mengakses Data Relasi
Setelah relasi didefinisikan, kita bisa mengakses data terkait dengan sangat mudah. Mari lihat contoh di controller:
Mengambil Produk Berdasarkan Kategori
use App\Models\Category;
// Ambil kategori beserta semua produknya
$category = Category::with('products')->find(1);
// Tampilkan nama kategori
echo $category->name;
// Loop untuk menampilkan produk-produk dalam kategori
foreach ($category->products as $product) {
echo $product->name . " - Rp " . $product->price;
}
Mengambil Kategori dari Produk
use App\Models\Product;
// Ambil produk beserta kategorinya
$product = Product::with('category')->find(1);
// Tampilkan nama produk
echo $product->name;
// Tampilkan nama kategori produk
echo $product->category->name;
Method with() digunakan untuk eager loading, yaitu teknik mengambil data relasi sekaligus untuk menghindari query berulang. Ini akan mengoptimalkan performa aplikasi kita.