Tutorial Laravel 10 - Part #7 - Model dan Relasi antar Model

Hi Semua, Masih melanjutkan materi sebelumnya tentang Database Migration di Laravel 10, Kali ini kita akan membahas tentang Model dan Relasi antar Model di Laravel 10.

Model atau di Laravel disebut dengan Eloquent Model pada umumnya adalah representasi tabel yang ada di database. Dengan adanya model, maka kita akan dimudahkan untuk melakukan interaksi dengan tabel-tabel yang ada dalam database baik untuk insert, update, delete data, dan sebagainya.

Membuat Model

Jalankan perintah berikut untuk membuat model:

php artisan make:model Product

Maka akan terbuat class model terbaru (Product.php) yang terdapat pada folder app/Models

namespace App\Models;

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

class Product extends Model{
	use HasFactory;
}

Membuat Model dan Migration dalam Satu Perintah

Untuk membuat model dan migration sekaligus dalam satu perintah, jalankan perintah berikut:

php artisan make:model Product -m

Perintah tersebut akan menghasilkan model app/Models/Product.php dan file migration database/migrations/xxxxxx_create_products_table.php

Relasi antar Model

Eloquent Model pada Laravel 9 mendukung berbagai variasi relasi yang umum di temui dalam pengembangan sebuah project web. Diantaranya adalah sebagai berikut:

  • One to One
  • One to Many
  • Many to Many
  • Has One Through
  • Has Many Through
  • One to One (Polymorphic)
  • One to Many (Polymorphic)
  • Many to Many (Polymorphic)

Dengan dukungan relasi antar model tersebut, kita akan dimudahkan ketika membuat sebuah fitur dengan keterkaitan data yang kompleks. Kemudahan tersebut akan kita rasakan saat nanti sudah menggunakan query builder dan chaining query yang mungkin nanti akan dibahas di tutorial tersendiri.

Relasi One to Many

Contoh case relasi one-to-many dapat kita temui dalam relasi antara Brand dengan Product, dimana sebuah nama brand itu umumnya akan mempunya banyak produk, dan sebaliknya sebuah produk hanya dimilik oleh satu brand/merk saja. Relasinya adalah Brand Has Many Product. Untuk gambaran struktur tabelnya kurang lebih akan seperti berikut:

Di dalam Model Brand (app/Models/Brand.php) untuk pendefinisian relasi ke modelĀ Product akan seperti berikut:

<?php

namespace App\Models;

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

class Brand extends Model
{
    use HasFactory;

    public function products(): HasMany
    {
        return $this->hasMany(Product::class);
    }
}

Sedangkan untuk model Product (app/Models/Product.php) kurang lebih seperti berikut:

<?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;

    public function brand(): BelongsTo
    {
        return $this->belongsTo(Brand::class);
    }
}

Setelah relasi didefinisikan, maka kita dapat mengambil daftar produk dari sebuah brand dengan kode program kurang lebih seperti berikut:

use App\Models\Brand;
 
$products = Brand::find(1)->products;
 
foreach ($products as $product) {
    //
}

Relasi Many to Many

Untuk relasi Many to Many dapat kita temui dalam relasi antara Category dan Product, dimana suatu kategori mempunyai banyak produk dan suatu produk bisa saja dimiliki oleh beberapa kategory. Dalam hal ini kita membutuhkan tabel pivot sebagai penghubung. Jadi untuk membuat relasi Many to Many ini kita membutuhkan 3 tabel yaitu categories, products, dan category_product. Penamaan tabel pivot sangat direkomendasikan diurutkan secara abjad, maka menjadi: category_product bukan product_category. Ini akan membuat Laravel secara otomatis mengenali tabel pivot tanpa kita mendefinisikannya dalam membuat relasi.

categories
		id - integer
		name - string
		
category_product
		category_id - integer
		product_id - integer

products
		id - integer
		sku - string
		name - string

Pendefinisian relasi ke produk pada model Category (app/Models/Category.php) akan seperti berikut:

<?php

namespace App\Models;

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

class Category extends Model
{
    use HasFactory;

    public function products(): BelongsToMany
    {
        return $this->belongsToMany(Product::class);
    }
}

Sedang pendefinisian relasi kategori pada model Product (app/Models/Product.php) akan seperti berikut:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Product extends Model
{
    use HasFactory;

    public function brand(): BelongsTo
    {
        return $this->belongsTo(Brand::class);
    }

    public function categories(): BelongsToMany
    {
        return $this->belongsToMany(Category::class);
    }
}

Setelah relasi didefinisikan, maka kita dapat mengambil daftar produk dari sebuah kategori dengan kode program kurang lebih seperti berikut:

use App\Models\Category;
 
$products = Category::find(1)->products;
 
foreach ($products as $product) {
    //
}

Untuk mempelajari relasi antar model dengan lebih detail, bisa kunjungi dokumentasi resminya Laravel Eloquent Relatonship

Selamat mencoba!

Tulis Komentar