Tabel sudah ada di database, tapi kalau mau query data, kita butuh cara yang lebih ekspresif daripada SQL mentah. Di sinilah Eloquent, ORM (Object-Relational Mapping) bawaan Laravel, berperan — setiap tabel direpresentasikan sebagai class PHP yang disebut model.
Mengakses relasi Post ↔ Category langsung lewat Tinker.
Generate model
php artisan make:model Category
php artisan make:model Post
Secara default, Eloquent menebak nama tabel dari nama model secara otomatis: model Post → tabel posts, model Category → tabel categories. Konvensi ini artinya kita jarang perlu menulis nama tabel secara manual.
Model Category
class Category extends Model
{
use HasFactory;
protected $fillable = ['name', 'slug'];
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}
Dua bagian penting:
$fillable— daftar kolom yang boleh diisi lewat mass assignment (Category::create([...])). Ini proteksi keamanan supaya kolom sensitif tidak bisa diisi sembarangan lewat input user.posts()— method relasi.hasMany(Post::class)artinya satu kategori punya banyak post.
Model Post
class Post extends Model
{
use HasFactory;
protected $fillable = ['category_id', 'title', 'slug', 'body', 'thumbnail'];
public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
}
belongsTo(Category::class) adalah kebalikan dari hasMany — satu post dimiliki oleh satu kategori. Relasi ini otomatis dipetakan lewat kolom category_id yang sudah kita buat di migration episode sebelumnya.
Mencoba lewat Tinker
Tinker adalah REPL bawaan Laravel — cara tercepat untuk eksperimen kode tanpa perlu bikin route atau controller dulu.
php artisan tinker
$category = App\Models\Category::create(['name' => 'Tutorial', 'slug' => 'tutorial']);
$post = App\Models\Post::create([
'category_id' => $category->id,
'title' => 'Hello World',
'slug' => 'hello-world',
'body' => 'Test body',
]);
echo $post->category->name; // "Tutorial"
echo $category->posts()->count(); // 1
Perhatikan $post->category->name — cukup akses relasi seperti properti biasa, Eloquent otomatis menjalankan query JOIN di belakang layar untuk mengambil kategori terkait.
Kenapa ini terasa "ajaib"
Dibanding menulis SQL manual:
SELECT categories.name FROM posts
JOIN categories ON posts.category_id = categories.id
WHERE posts.id = 1;
Eloquent membiarkan kita menulis $post->category->name — jauh lebih mudah dibaca dan tetap type-safe berkat return type BelongsTo dan HasMany di method relasi.
Selanjutnya
Sekarang kita punya dua cara untuk query database: Query Builder (DB::table()) dan Eloquent (Post::query()). Episode berikutnya kita bandingkan langsung keduanya.