Back to IF3110 Pengembangan Aplikasi Berbasis Web

Topic

Questions/Cues

  • Relasi One-to-One?

  • Method hasOne?

  • Relasi (inverse) belongsTo?

  • Cara query relasi 1-to-1?

  • Relasi One-to-Many?

  • Method hasMany?

  • Cara query relasi 1-to-many?

  • Query relasi (method)?

  • Relasi Many-to-Many?

  • Struktur tabel M-to-M?

  • Apa itu “Pivot Table”?

  • Method belongsToMany?

  • Cara query relasi M-to-M?

Reference Points

  • Slides IF3110-10b-Web-Application-Framework-Laravel.pdf (Slide 42-51)

Pendahuluan Relasi

Eloquent memungkinkan kita mendefinisikan relasi antar model. Ini membuat kita bisa mengambil dan memanipulasi data yang terhubung dengan cara yang sangat mudah dan intuitif.

Relasi One-to-One (1-ke-1)

Contoh: Satu User memiliki satu Phone.

Definisi Model:

  • Di Model User (misal: app/Models/User.php):

    public function phone() {
        return $this->hasOne(Phone::class);
    }
  • Di Model Phone (Relasi kebalikan / inverse):

    public function user() {
        return $this->belongsTo(User::class);
    }

    (Eloquent berasumsi foreign key di tabel phones adalah user_id).

Cara Query:

Kita bisa mengakses relasi ini seolah-olah property dari model (disebut dynamic property).

$phone = User::find(1)->phone;

Relasi One-to-Many (1-ke-banyak)

Contoh: Satu Post memiliki banyak Comment.

Definisi Model:

  • Di Model Post (app/Models/Post.php):

    public function comments() {
        return $this->hasMany(Comment::class);
    }
  • Di Model Comment (Relasi kebalikan / inverse):

    public function post() {
        return $this->belongsTo(Post::class);
    }

    (Eloquent berasumsi foreign key di tabel comments adalah post_id).

Cara Query:

  • Mengambil semua comment dari post ID 1:

    $comments = Post::find(1)->comments; // Mengembalikan Collection

  • Mengambil post dari sebuah comment:

    $postTitle = Comment::find(1)->post->title;

Query pada Relasi:

Jika kita ingin menambahkan constraint (seperti where) pada relasi, kita harus mengakses relasi sebagai method (menggunakan ()), bukan property:

$comment = Post::find(1)->comments()
	->where('title', 'foo')
	->first();

Relasi Many-to-Many (banyak-ke-banyak)

Contoh: Satu User bisa memiliki banyak Role (peran), dan satu Role bisa dimiliki oleh banyak User.

Struktur Tabel:

Relasi ini memerlukan tabel perantara (pivot table).

  • users (kolom: id, name)

  • roles (kolom: id, name)

  • role_user (kolom: user_id, role_id) Ini adalah pivot table.

Definisi Model:

  • Di Model User (app/Models/User.php):

    public function roles() {
        return $this->belongsToMany(Role::class);    
    }
  • Di Model Role (app/Models/Role.php):

    public function users() { 
        return $this->belongsToMany(User::class);
    }

Cara Query:

 
// Mengambil semua role dari user ID 1
$user = User::find(1);
foreach ($user->roles as $role) { ... }
 
// Bisa juga di-query sebagai method
$roles = User::find(1)->roles()->orderBy('name')->get();

Summary

Eloquent Relationships adalah fitur inti yang menghubungkan model satu sama lain, mencerminkan relasi di database. Relasi didefinisikan sebagai method di dalam class Model. hasOne (1-ke-1) dan hasMany (1-ke-banyak) digunakan untuk mendefinisikan relasi “maju”, sementara belongsTo digunakan untuk relasi “kebalikan” (inverse). Relasi belongsToMany (banyak-ke-banyak) memerlukan sebuah tabel pivot perantara untuk berfungsi. Kita dapat mengakses data relasi dengan mudah sebagai dynamic property (misal: $user->phone) atau sebagai query builder untuk filtering lebih lanjut (misal: $user->comments()->where(...)).