Model & ORM

NusaFramework menyediakan ORM (Object-Relational Mapping) sederhana — query database tanpa menulis SQL berulang-ulang.

Referensi Fungsi ORM

FungsiDeskripsiSQL Setara
daftar_model(nama, tabel)Daftarkan model ke registry
Model_semua(nama)Ambil semua barisSELECT * FROM tabel
Model_semua(nama, orderBy)Ambil semua dengan urutanSELECT * ... ORDER BY
Model_temukan(nama, id)Cari satu baris by IDSELECT * WHERE id=?
Model_cari(nama, kolom, nilai)Cari baris berdasarkan kolomSELECT * WHERE kolom=?
Model_buat(nama, data)Insert baris baruINSERT INTO tabel ...
Model_perbarui(nama, id, data)Update baris by IDUPDATE tabel SET ... WHERE id=?
Model_hapus(nama, id)Hapus baris by IDDELETE FROM tabel WHERE id=?
Model_hitung(nama)Hitung total barisSELECT COUNT(*) FROM tabel
db_framework(db)Atur/ambil koneksi DB global

Mendaftarkan Model

app/model/Produk.ns
// Daftarkan model ke ORM registry NusaFramework
// Parameter: nama_model, nama_tabel
daftar_model("Produk", "produk")

// Fungsi query kustom untuk model ini
fungsi Produk_aktif() {
    buat db = db_framework()
    kembalikan db_ambil_semua(db, "SELECT * FROM produk WHERE aktif=1 ORDER BY id DESC")
}

fungsi Produk_kategori(kategori) {
    buat db = db_framework()
    kembalikan db_ambil_semua(db,
        "SELECT * FROM produk WHERE kategori=? AND aktif=1", kategori)
}

Operasi CRUD Lengkap

Semua Operasi ORM
// === SELECT ALL ===
buat semua = Model_semua("Produk")
// → Array semua produk

// SELECT ALL dengan urutan
buat terurut = Model_semua("Produk", "harga ASC")
// → Array produk diurutkan dari termurah

// === SELECT ONE ===
buat produk = Model_temukan("Produk", 5)
// → Satu peta produk atau nihil

jika produk == nihil {
    tampilkan("Produk tidak ditemukan")
}
tampilkan("Nama:", ambil(produk, "nama"))

// === SELECT WHERE ===
buat laptop = Model_cari("Produk", "kategori", "laptop")
// → Array produk dengan kategori laptop

// === INSERT ===
Model_buat("Produk", {
    "nama"      : "NusaBook Pro",
    "deskripsi" : "Laptop tipis performa tinggi",
    "harga"     : 12500000,
    "stok"      : 15,
    "kategori"  : "laptop"
})

// === UPDATE ===
Model_perbarui("Produk", 5, {
    "harga" : 11500000,
    "stok"  : 20
})

// === DELETE ===
Model_hapus("Produk", 5)

// === COUNT ===
buat total = Model_hitung("Produk")
tampilkan("Total produk:", total)

Query SQL Kustom

Untuk query yang lebih kompleks, gunakan db_ambil_semua dan db_ambil_satu langsung:

Query JOIN dan Agregasi
buat db = db_framework()

// Query JOIN
buat pesanan = db_ambil_semua(db, "
    SELECT p.*, u.nama as nama_pengguna
    FROM pesanan p
    JOIN pengguna u ON u.id = p.pengguna_id
    WHERE p.status = ?
    ORDER BY p.dibuat_pada DESC
    LIMIT 20
", "pending")

// Agregasi
buat statistik = db_ambil_satu(db, "
    SELECT
        COUNT(*) as total_produk,
        SUM(stok) as total_stok,
        AVG(harga) as rata_harga,
        MAX(harga) as harga_tertinggi
    FROM produk WHERE aktif=1
")

tampilkan("Total produk:", ambil(statistik, "total_produk"))
tampilkan("Rata-rata harga:", format_rupiah(ambil(statistik, "rata_harga")))

Koneksi Database Framework

Setup di server.ns
// Buka koneksi database
buat db = db_buka(DB_DRIVER, DB_PATH)
// → DB_DRIVER: "sqlite" atau "mysql"
// → DB_PATH: path file SQLite atau DSN MySQL

// Simpan ke framework — bisa diakses dari mana saja
db_framework(db)

// Akses dari model/kontroler manapun:
buat db = db_framework()  // dapatkan koneksi yang tersimpan
📌 Penting: Panggil db_framework(db) di server.ns sebelum memuat model apapun. Jika tidak, fungsi ORM seperti Model_semua akan error karena koneksi belum ada.