Dalam database, relasi One To Many (Satu ke Banyak) adalah salah satu yang paling umum digunakan. Relasi ini menggambarkan hubungan di mana satu model dapat memiliki banyak model lain, tetapi setiap model yang terkait hanya dimiliki oleh satu model induk.
Contoh klasik dari relasi ini adalah:
- Satu Post bisa memiliki banyak Comments.
- Satu User bisa memiliki banyak Posts.
- Satu Category bisa memiliki banyak Products.
Pada tutorial ini, kita akan mempelajari cara mengimplementasikan relasi One To Many di Laravel menggunakan Eloquent ORM. Kita akan menggunakan contoh relasi antara Category dan Product.
Persiapan Awal
Pastikan Anda sudah memiliki hal-hal berikut:
- Proyek Laravel: Proyek Laravel Anda sudah berjalan dan terhubung ke database.
- Migration untuk Tabel: Kita akan membuat dua tabel:
categoriesdanproducts.Migration untuk Tabel
categories:Bashphp artisan make:migration create_categories_table --create=categoriesModifikasi file migration
create_categories_tabledidatabase/migrations:PHPpublic function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('nama_kategori'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('categories'); }Migration untuk Tabel
products:Bashphp artisan make:migration create_products_table --create=productsModifikasi file migration
create_products_tabledidatabase/migrationsuntuk menambahkan foreign key ke tabelcategories.PHPpublic function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->foreignId('category_id')->constrained()->onDelete('cascade'); $table->string('nama_produk'); $table->integer('harga'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('products'); }foreignId('category_id'): Laravel menyediakan metode yang ringkas ini untuk membuat kolomUNSIGNED BIGINTyang sesuai dengan konvensiiddi tabelcategories.constrained(): Metode ini secara otomatis mendefinisikan foreign key ke tabel yang sesuai dengan nama kolom. Dalam kasus ini, ke tabelcategories.onDelete('cascade'): Opsi ini sangat penting. Jika sebuah kategori dihapus, semua produk yang berelasi dengan kategori tersebut juga akan ikut terhapus.
Jalankan migration Anda:
php artisan migrate
- Model: Buat dua model yang sesuai:
CategorydanProduct.Bashphp artisan make:model Category php artisan make:model Product
Langkah 2: Mendefinisikan Relasi di Model Eloquent
Sekarang, kita definisikan relasi One To Many di kedua model.
Model Category.php (app/Models/Category.php)
Tambahkan method products() yang mendefinisikan bahwa satu kategori dapat memiliki banyak produk.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Category extends Model
{
use HasFactory;
protected $fillable = ['nama_kategori'];
/**
* Get the products for the category.
*/
public function products(): HasMany
{
return $this->hasMany(Product::class);
}
}
hasMany(Product::class): Metode ini menunjukkan bahwa satuCategorymemiliki banyakProduct. Eloquent akan secara otomatis mencari kolomcategory_iddi tabelproducts.
Model Product.php (app/Models/Product.php)
Tambahkan method category() yang mendefinisikan relasi kebalikannya.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Product extends Model
{
use HasFactory;
protected $fillable = ['category_id', 'nama_produk', 'harga'];
/**
* Get the category that owns the product.
*/
public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
}
belongsTo(Category::class): Metode ini menunjukkan bahwa satuProductdimiliki oleh satuCategory.
Langkah 3: Berinteraksi dengan Relasi One To Many
Sekarang kita bisa menggunakan relasi ini di controller atau di artisan tinker.
Mengambil Data dengan Relasi (Eager Loading)
Untuk menghindari masalah N+1 query, gunakan eager loading dengan metode with().
use App\Models\Category;
// Mengambil semua kategori beserta produk-produknya
$categories = Category::with('products')->get();
foreach ($categories as $category) {
echo "Kategori: " . $category->nama_kategori . "<br>";
echo "Daftar Produk:<br>";
foreach ($category->products as $product) {
echo "- " . $product->nama_produk . "<br>";
}
echo "<hr>";
}
Anda juga bisa mengambil data dari sisi Product.
use App\Models\Product;
// Mengambil semua produk beserta kategori induknya
$products = Product::with('category')->get();
foreach ($products as $product) {
echo "Produk: " . $product->nama_produk . "<br>";
echo "Kategori: " . $product->category->nama_kategori . "<br>";
echo "<hr>";
}
Menambah Data dengan Relasi
Anda bisa menambahkan produk baru dan secara otomatis menetapkan relasinya dengan kategori induk.
use App\Models\Category;
$category = Category::find(1); // Ambil kategori dengan ID 1
$category->products()->create([
'nama_produk' => 'Baju Kemeja',
'harga' => 150000
]);
Metode products() di atas akan secara otomatis mengisi category_id pada produk baru dengan id dari kategori induk.
Kesimpulan
Relasi One To Many adalah fundamental dalam pengembangan database, dan Laravel membuatnya sangat intuitif dengan Eloquent ORM. Dengan mendefinisikan relasi di model, Anda dapat dengan mudah mengambil, menambah, dan mengelola data yang berelasi, tanpa perlu menulis query SQL yang kompleks. Ini membuat kode Anda lebih bersih, mudah dibaca, dan mempercepat proses pengembangan aplikasi web.
Pada tutorial selanjutnya, kita akan membahas relasi One To One yang merupakan kebalikan dari tutorial ini. Tetap ikuti seri tutorial Laravel ini!