Study
Vapor

Fluent Relationship

Penjelasan

Fluent mendukung relasi antar model mirip foreign key di SQL. Untuk relasi 'banyak baris milik satu induk' (many-to-one dari sisi child), model child punya property @Parent(key:) yang menunjuk ke model induk lewat kolom foreign key. Untuk sisi sebaliknya (satu induk punya banyak anak), model induk punya property @Children(for:) yang menunjuk ke key path relasi @Parent di model child. @Parent WAJIB disertai migration yang mendefinisikan foreign key lewat .field("parent_id", .uuid, .required, .references("tabel_induk", "id")). Untuk mengambil data relasi, gunakan .with(\Model.$relasi) saat query, atau panggil .get(on: req.db) langsung pada property relasinya setelah model induk di-load.

Contoh Konsep

import Fluent
import Vapor

final class Pengguna: Model, Content {
    static let schema = "pengguna"
    @ID(key: .id) var id: UUID?
    @Field(key: "nama") var nama: String
    @Children(for: \.$pemilik) var catatan: [Catatan]
    init() { }
}

final class Catatan: Model, Content {
    static let schema = "catatan"
    @ID(key: .id) var id: UUID?
    @Field(key: "judul") var judul: String
    @Parent(key: "pengguna_id") var pemilik: Pengguna
    init() { }
}

// Query dengan eager loading:
// Pengguna.query(on: req.db).with(\.$catatan).all()

Praktikum

Buat final class Komentar: Model, Content dengan @Parent(key: "catatan_id") var catatan: Catatan, dan field isi: String. Tambahkan juga @Children(for: \.$catatan) var komentar: [Komentar] pada class Catatan yang sudah ada.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Lupa memanggil .with(...) saat query induk membuat property @Children kosong walau sebenarnya ada data terkait di database — Fluent tidak meng-eager-load relasi secara otomatis, harus diminta eksplisit demi performa.