Relasi One to Many di Eloquent
Hubungkan model induk-anak dengan hasMany dan belongsTo mengikuti konvensi Laravel.
Konsepnya
Relasi one to many: satu user punya banyak post, tapi satu post hanya milik satu user. Di database ini diwakili foreign key user_id di tabel posts.
Definisikan di kedua model
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Model
{
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Post extends Model
{
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}Laravel menebak foreign key user_id dari nama method dan model. Kalau nama kolommu beda, teruskan sebagai argumen kedua: hasMany(Post::class, 'penulis_id').
Memakai relasi
$user = User::find(1);
// Ambil semua post milik user (Collection)
foreach ($user->posts as $post) {
echo $post->judul;
}
// Dari sisi anak: siapa pemiliknya
$post = Post::find(1);
echo $post->user->nama;
// Query lewat relasi (tanpa load semua dulu)
$published = $user->posts()->where('status', 'published')->get();
$count = $user->posts()->count();Perhatikan bedanya: $user->posts (properti) langsung me-load data, sedangkan $user->posts() (method) mengembalikan query builder yang bisa dilanjut dengan where, orderBy, dan sebagainya.
Membuat data lewat relasi
$user = User::find(1);
// user_id otomatis diisi
$post = $user->posts()->create([
'judul' => 'Post Baru',
'slug' => 'post-baru',
'isi' => 'Isi...',
]);
// Atau simpan model yang sudah ada
$post = new Post(['judul' => 'X', 'slug' => 'x', 'isi' => '...']);
$user->posts()->save($post);Catatan teknis: Penamaan method relasi itu tunggal untuk
belongsTo(user()) dan jamak untukhasMany(posts()). Ini bukan aturan mesin, tapi konvensi yang bikin kode enak dibaca dan dipahami tim. Konsisten sejak awal menghemat banyak kebingungan.