laraveleloquentrelasiMenengah3 mnt baca

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

php
// 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);
    }
}
php
// 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

php
$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

php
$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 untuk hasMany (posts()). Ini bukan aturan mesin, tapi konvensi yang bikin kode enak dibaca dan dipahami tim. Konsisten sejak awal menghemat banyak kebingungan.