Tutorial Membuat Relasi Model Pada Laravel 5.8/6.x/7.x

Kukuhs.kom 25 Juli 2020 04:25:59

Tutorial membuat relasi model pada Laravel. Berlaku untuk Laravel 5.8, 6.x, dan 7.x. Laravel itu Mudah!

Jangan lupa berdo’a dulu ya sebelum belajar : )

Bismillaah.

Pahami dulu 3 jenis relasi yang ada.

  1. One-to-One
  2. One-to-Many
  3. Many-to-Many

One-to-One

Relasi one-to-one contohnya adalah relasi tabel pegawai dengan tabel akun user (untuk login). Satu pegawai hanya bisa memiliki satu akun login. Satu akun login hanya bisa dimiliki oleh 1 pegawai. Sudah paham? Satu X hanya bisa memiliki satu Y. Satu Y hanya bisa memiliki satu X.

One-to-Many

Relasi one-to-many contohnya adalah relasi tabel pegawai dengan tabel departemen. Satu pegawai hanya bisa bekerja pada satu departemen. Satu departemen memiliki banyak pegawai. Sudah paham? Satu X hanya bisa memiliki satu Y. Satu Y bisa memiliki banyak X.

Many-to-Many

Relasi many-to-many contohnya adalah relasi tabel pegawai dengan tabel proyek. Satu pegawai mengerjakan lebih dari satu proyek. Satu proyek dikerjakan lebih dari satu pegawai. Sudah paham? Satu X bisa memiliki banyak Y dan satu Y bisa memiliki banyak X.

1. Cara menulis relasi one-to-one pada Model.

1.1 Cara Satu.

Dengan adanya relasi one-to-one, Model kamu akan terlihat seperti berikut ini.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawai()
    {
        return $this->hasOne('App\Pegawai');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model user.
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

Dengan demikian bisa dikatakan satu User memiliki satu Pegawai. Satu Pegawai dimiliki satu User.

1.2 Cara Dua.

Bisa juga dibalik, tergantung sudut pandangnya.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawai()
    {
        return $this->belongsTo('App\Pegawai');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model user.
    public function user()
    {
        return $this->hasOne('App\User');
    }
}

Dengan demikian bisa dikatakan satu Pegawai memiliki satu User. Satu User dimiliki satu Pegawai.

1.3 Cara Tiga.

Bahkan bisa juga menggunakan hasOne semua atau belongsTo semua.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawai()
    {
        return $this->hasOne('App\Pegawai');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model user.
    public function user()
    {
        return $this->hasOne('App\User');
    }
}

Semua cara di atas bisa digunakan. Namun, cara ketiga tidak direkomendasikan karena secara semantik kurang bagus.

1.4 Cara untuk Memanggil Relasi.

Cara memanggilnya adalah seperti berikut ini.

$user = Pegawai::find($id)->user;
echo $user->email;
echo $user->created_at;
echo $user->password;
$pegawai = User::find($id)->pegawai;
echo $pegawai->nama;
echo $pegawai->tanggal_lahir;
echo $pegawai->jenis_kelamin;

2. Cara menulis relasi one-to-many pada Model.

2.1 Cara Satu.

Dengan adanya relasi one-to-may, Model kamu akan terlihat seperti berikut ini.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model departemen.
    public function departemen()
    {
        return $this->belongsTo('App\Departemen');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Departemen extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawais()
    {
        return $this->hasMany('App\Pegawai');
    }
}

2.2 Cara Dua.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model departemen.
    public function departemen()
    {
        return $this->hasOne('App\Departemen');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Departemen extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawais()
    {
        return $this->belongsToMany('App\Pegawai');
    }
}

2.3 Cara Tiga.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model departemen.
    public function departemen()
    {
        return $this->hasOne('App\Departemen');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Departemen extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawais()
    {
        return $this->hasMany('App\Pegawai');
    }
}

Semua cara di atas bisa digunakan. Namun gunakanlah hasMany, belongsTo, dan belongsToMany sesuai semantik.

2.4 Cara untuk Memanggil Relasi

Cara memanggilnya adalah seperti berikut ini.

$departemen = Pegawai::find($id)->departemen;
echo $departemen->nama;
echo $departemen->gedung;
echo $departemen->lantai;
$pegawais = Departemen::find($id)->pegawais;
foreach($pegawais as $pegawai) {
    echo $pegawai->nama;
    echo $pegawai->tanggal_lahir;
    echo $pegawai->jenis_kelamin;
}

3. Cara menulis relasi many-to-many pada Model.

3.1 Cara Satu.

Dengan adanya relasi many-to-may, Model kamu akan terlihat seperti berikut ini.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    public function departemen()
    {
        return $this->belongsTo('App\Departemen');
    }

    // Tambahkan fungsi ini untuk merelasikan ke model proyek.
    public function proyeks()
    {
        return $this->hasMany('App\Proyek');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Proyek extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawais()
    {
        return $this->belongsToMany('App\Pegawai');
    }
}

3.2 Cara Dua.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    public function departemen()
    {
        return $this->belongsTo('App\Departemen');
    }

    // Tambahkan fungsi ini untuk merelasikan ke model proyek.
    public function proyeks()
    {
        return $this->belongsToMany('App\Proyek');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Proyek extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawais()
    {
        return $this->hasMany('App\Pegawai');
    }
}

3.3 Cara Tiga.

Bahkan bisa juga menggunakan hasMany semua atau belongsToMany semua.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pegawai extends Model
{
    public function departemen()
    {
        return $this->hasOne('App\Departemen');
    }

    // Tambahkan fungsi ini untuk merelasikan ke model proyek.
    public function proyeks()
    {
        return $this->hasMany('App\Proyek');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Proyek extends Model
{
    // Tambahkan fungsi ini untuk merelasikan ke model pegawai.
    public function pegawais()
    {
        return $this->hasMany('App\Pegawai');
    }
}

Semua cara di atas bisa digunakan. Namun gunakanlah hasMany dan belongsToMany sesuai semantik.

3.4 Cara untuk Memanggil Relasi.

Cara memanggilnya adalah seperti berikut ini.

$proyeks = Pegawai::find($id)->proyeks;
foreach($proyeks as $proyek) {
    echo $proyek->nama;
    echo $proyek->tanggal_mulai;
    echo $proyek->tanggal_selesai;
}
$pegawais = Proyek::find($id)->pegawais;
foreach($pegawais as $pegawai) {
    $departemen = $pegawai->departemen;
    echo $pegawai->nama;
    echo $departemen->name;
    echo $pegawai->departemen->name;
}

Best Practice

Gunakanlah penamaan singular untuk penamaan nama fungsi relasi one-to-one (hasOne dan belongsTo). Contohnya: pegawai, departemen, proyek. Gunakanlah penamaan plural untuk penamaan nama fungsi relasi one-to-many (hasMany dan belongsToMany). Contohnya: pegawais, departemens, proyeks.