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).
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(...)).
Additional Information
Topik Teknis: ->phone vs ->phone() (Property vs Method)
Ini adalah konsep paling penting namun sering membingungkan dalam Eloquent:
$user->phone (Dynamic Property)
Apa ini? Mengakses relasi sebagai property.
Apa yang dilakukan? Eloquent akan langsung mengeksekusiquery untuk mengambil data relasi dan mengembalikan hasilnya (satu instance Model Phone atau null).
Kapan digunakan? 90% kasus, saat Anda hanya ingin mengambil data.
$user->phone() (Relationship Method)
Apa ini? Mengakses relasi sebagai method (dengan ()).
Apa yang dilakukan? Eloquent tidak mengeksekusiquery. Ia mengembalikan instancedariquery builder relasi itu sendiri.
Kapan digunakan? Saat Anda perlu menambahkanconstraint (seperti where, orderBy) pada query relasi tersebut sebelum dieksekusi, atau saat Anda ingin membuat/menyimpan data relasi baru (misal: $user->comments()->create(...)).
Penamaan Tabel Pivot (Many-to-Many)
Eloquent sangat bergantung pada konvensi. Untuk pivot table antara User dan Role, Eloquent akan mencari tabel bernama role_user (nama model singular, diurutkan berdasarkan abjad, dipisah underscore). Jika nama tabel Anda berbeda (misal: users_to_roles), Anda harus menentukannya secara manual: