Save() di ORM: Praktis, Tapi Kadang Bikin Data Korban
2025-05-25
pro-kontra-developerπ’ DISCLAIMER
Ini pro kontra aja yaaa, jangan branteeem, pilih yang terbaik menurut kamu aja. Tapi, Klo km ngerasa yg bikin ga aman sih, yaaa segera tobat!! Hehe π
si tester
Guuuuys, Kenapa user admin di production jadi user biasa semua ya? π
14.20
si paling ribet
Ini siapa yang bikin fungsi update nya?!
14.21
si paling praktis
Yaelah, udh gw pake save() di api update...
14.22
si paling ribet
Bentar, Lu save se-object dari payload frontend? π±π±π±
14.22
si paling praktis
Iya, tapi kan dari FE nya cuma is_active doang yang diubah...
14.22
si paling ribet
Lha! kalo field lain NULL atau kosong gimana? Ketiban default di DB tuh π¬
14.23
si tester
Guuuuys, udaaaaah, ini semua role user berubah loh πππ, benerin iiiiiih ....
14.25
save()
Jadi Pilihan?save()
Bisa Jadi BumerangORM .save()
itu abstraction yang powerful...
Tapi kalau kita kasih data setengah matang, ORM bisa aja ngira:
"Oh ini NULL? Berarti lo mau update NULL ya?"
Padahal⦠bisa jadi frontend gak kirim field itu.
Hindari langsung .save()
dari payload frontend untuk update sebagian data. Ini kaya ngasih senjata ke ORM tanpa
kasih tahu targetnya.
Menggunakan .save()
langsung dari payload frontend tanpa validasi atau sanitasi bisa berujung ke masalah besar.
Misalnya:
Ts
const payload = {
id: 123,
is_active: true, // cuma ini yang dimaksud
// field lain gak dikirim β jadi undefined/null
};
await userRepo.save(payload); // β Field lain bisa ke-replace
Kenapa ini bisa bahaya?
role
, status
, atau flag
bisa hilang nilainya jika tidak ikut dikirim oleh frontend.Pastikan dulu field data yang masuk konsesten dengan yang akan diupdate. Lakukan validasi dan sanitasi sebelum update. Update field yang memang dimaksud, jangan asal save.
Untuk partial update yang aman, kamu bisa gunakan pendekatan eksplisit di masing-masing stack:
Ts
await User.updateOne(
{ _id: userId },
{ $set: { is_active: true } }
);
Go
_, err := db.Exec(`UPDATE users SET is_active = $1 WHERE id = $2`, true, userID)
Php
User::where('id', $userId)->update(['is_active' => true]);
Semua contoh di atas:
Tips tambahan:
β οΈ ORM itu bukan cenayang. Dia gak tau mana field yang sengaja dikosongin, mana yang gak dikirim.
Kalau update-nya full dan valid β boleh pakai .save()
.
Kalau cuma ubah sebagian atau dari frontend β mending .update()
.
Situasi | Rekomendasi |
---|---|
Update lengkap, data bersih | Boleh pakai `.save()` |
Partial update | Gunakan `.update()` explicit |
Field sensitif (role, status, flag) | Wajib eksplisit! Jangan nekat `save()` |
βΉοΈ Beberapa ORM (kayak TypeORM, Sequelize) punya fitur preload/merge. Tapi tetep: abstraction bukan alasan buat males mikir.
Lo tim save()
atau update()
?
Pernah kena kasus field ketiban NULL cuma karena form gak lengkap?
Yuk share pengalaman lo. Biar semua developer belajar dari kasus nyata, bukan cuma dari dokumentasi.
Konten Terkait :