What is ORM Prisma?
Sebelum kita ke cara coding kita kenali dulu apa itu ORM Prisma
Prisma ORM (Object-Relational Mapping) merupakan sebuah aalat pemetaan objek-relasional, memfasilitasi penanganan interaksi antara pemrograman aplikasi berbasis bahasa (misalnya, JavaScript atau naskah) dan database relasional. Dengan memanfaatkan prisma orm, pengembang dapat dengan mulus mengintegrasikan dan memanipulasi data dalam database relasional tanpa memerlukan penulisan permintaan SQL langsung. Prisma memungkinkan representasi langsung tabel basis data sebagai objek dalam model aplikasi, sehingga menawarkan cara intuitif dan terstruktur untuk berinteraksi dengan database relasional. Pendekatan ini meningkatkan efisiensi pengembangan, sementara secara bersamaan mengurangi kerumitan yang terkait dengan kueri basis data.
Cara install ORM prisma
Sebelum kita persiapkan kita install dulu NODEJS, setelah mengistall kita lanjut install ORM Prisma nya
1 2 |
npm init -y npm install prisma --save-dev |
Jika kalian ingin install package lain bisa untuk memudahkan kalian
Sekarang kita install package database di sini kita pakai PostgreSQL dan jangan lupa install pgAdmin
1 |
npx prisma init --datasource-provider psgsql |
Berikut code model Prisma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Admin { id Int @id @default(autoincrement()) username String @unique password String createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("admins") } model Ulasan { id Int @id @default(autoincrement()) nama String tempat String ulasan String @@map("ulasan") } model Kecamatan { id Int @id @default(autoincrement()) nama String slug String @unique hotels Hotel[] wisatas Wisata[] @@map("kecamatan") } model FasilitasHotel { id Int @id @default(autoincrement()) nama String isActive Boolean @map("is_active") jumlah Int hotel Hotel? @relation(fields: [hotelId], references: [id]) hotelId Int? @@map("fasilitas_hotel") } model FasilitasWisata { id Int @id @default(autoincrement()) nama String isActive Boolean @map("is_active") jumlah Int wisata Wisata? @relation(fields: [wisataId], references: [id]) wisataId Int? @@map("fasilitas_wisata") } model Hotel { id Int @id @default(autoincrement()) title String slug String @unique deskripsi String linkmap String alamat String nohp String hargaMin String @map("hargaMin") hargaMax String @map("hargaMax") isPopular Boolean jarak Int rating Float checkIn String @map("checkIn") checkOut String @map("checkOut") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") kecamatan Kecamatan @relation(fields: [kecamatanId], references: [id]) kecamatanId Int image1 String imageFileName1 String? @map("image_filename1") image2 String imageFileName2 String? @map("image_filename2") image3 String imageFileName3 String? @map("image_filename3") fasilitasHotel FasilitasHotel[] wisataHasHotel WisataHasHotel[] @@map("hotel") } model Wisata { id Int @id @default(autoincrement()) title String slug String @unique deskripsi String linkmap String alamat String nohp String hargaMin String @map("hargaMin") hargaMax String @map("hargaMax") jarak Int rating Float jamBuka String @map("jam_buka") jamTutup String @map("jam_tutup") isPopular Boolean kecamatan Kecamatan @relation(fields: [kecamatanId], references: [id]) kecamatanId Int createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") image1 String imageFileName1 String? @map("image_filename1") image2 String imageFileName2 String? @map("image_filename2") image3 String imageFileName3 String? @map("image_filename3") fasilitasWisata FasilitasWisata[] wisataHasHotel WisataHasHotel[] @@map("wisata") } model WisataHasHotel { id Int @id @default(autoincrement()) Hotel Hotel? @relation(fields: [hotelId], references: [id]) hotelId Int? Wisata Wisata? @relation(fields: [wisataId], references: [id]) wisataId Int? @@map("WisataHasHotel") } |
Di sini membuat model di atas id sebagai autoincremenr dan integer, title sebagai string dan content sebagai string boleh di isi atau tidak
Run a migration to create your database tables with Prisma Migrate
1 |
npx prisma migrate dev --name init |
Membuat database secara otomatis dengan cara migrasi
Kita jalankan code nya
Sebelum di jalankan buka index.js kalian
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
require("dotenv").config(); const express = require("express"); const app = express(); const PORT = process.env.PORT || 3000; const cors = require("cors"); const bodyParser = require("body-parser"); const errorHanding = require("./middlewares/errorHanding"); // app.use( // express.json({ // strict: false, // }) // ); // app.use(cors()); app.use(express.json()); // body-parser is now deprecated as of Express 4.16+ // app.use(express.urlencoded({ extended: false })); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // app.use(express.json()); app.use(cors()); //Ini buat error Handingling app.use(errorHanding); app.get("/test-connection", (req, res) => { return res.status(200).send("ok"); }); const router = require("./routers"); app.use("/api/v1", router); app.get("/", (req, res) => { res.json({ message: "Welcome client.", }); }); app.use("*", (req, res) => { return res.status(404).json({ error: "End Poinst is Not Register Not Found 404", }); }); app.listen(PORT, () => { console.log(`Server is Running at PORT ${PORT}`); console.log(`Server is running on http://localhost:${PORT}`); }); |
Berikit contoh index.js untuk jalankan kita cukup node index.js atau bisa npm start.
Route
Sekarang kita ke route, Berikut salah satu route yang Anda gunakan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const express = require('express'); const router = express.Router(); const adminRouter = require('./admin.router'); const ulasanRouter = require('./ulasan.router'); const kecamatanRouter = require('./kecamatan.router'); const hotelRouter = require('./hotel.router'); const wisataRouter = require('./wisata.router'); const fasilitasHotel = require('./fasilitasHotel.router') const fasilitasWisata = require('./fasilitasWisata.router') router.use("/admin", adminRouter) router.use("/ulasan", ulasanRouter) router.use("/kecamatan", kecamatanRouter) router.use("/hotel", hotelRouter) router.use("/wisata", wisataRouter) router.use("/fasilitasHotel", fasilitasHotel) router.use("/fasilitasWisata", fasilitasWisata) module.exports=router |
Route di sini berfungsi mendifinisikan end point
Controller
Sekarang kita ke Controller, Berikut salah Controller yang dapat Anda gunakan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
const { kecamatan, hotel, wisata } = require("../models"), utils = require("../utils"); module.exports = { create: async (req, res, next) => { try { const { nama } = req.body; const nameSlug = await utils.createSlug(nama); const data = await kecamatan.create({ data: { nama: nama, slug: nameSlug, }, }); return res.status(201).json({ data: data, }); } catch (error) { next(error); } }, getKecamatan: async (req, res, next) => { try { const dataKecamatan = await kecamatan.findUnique({ where: { id: parseInt(req.params.id), }, }); return res.status(201).json({ data: dataKecamatan, }); } catch (error) { next(error); } }, getAllKecamatan: async (req, res, next) => { try { const dataKecamatan = await kecamatan.findMany(); return res.status(201).json({ data: dataKecamatan, }); } catch (error) { next(error); } }, update: async (req, res, next) => { try { const namaSlug = await utils.createSlug(req.body.nama); const data = await kecamatan.update({ where: { id: parseInt(req.params.id), }, data: { nama: req.body.nama, slug: namaSlug, }, }); return res.status(200).json({ data, }); } catch (error) { next(error); } }, destroy: async (req, res, next) => { try { const dataKecamatan = await kecamatan.delete({ where: { id: parseInt(req.params.id), }, }); return res.status(200).json("Data Berhasil di hps", dataKecamatan); } catch (error) { return next(error); } }, getAllKecamatanAndCountHotelOrWisata : async (req, res, next) => { try { try { const dataKecamatan = await kecamatan.findMany({ include:{ _count:{ select:{ hotels:true, wisatas: true } } } }); res.status(200).json({ status: true, message: "OK!", err: null, data: dataKecamatan, }); } catch (err) { res.status(400).json({ status: false, message: "Bad request!", err: err.message, data: null, }); } } catch (err) { next(err); } }, getAllHotelByKecamatan : async(req, res, next)=>{ try { const dataKecamatan = await kecamatan.findUnique({ where: { id: parseInt(req.params.id), },include:{ hotels: true }, }); return res.status(201).json({ data: dataKecamatan, }); } catch (error) { next(error); } }, getAllWisataByKecamatan : async(req, res, next)=>{ try { const dataKecamatan = await kecamatan.findUnique({ where: { id: parseInt(req.params.id), },include:{ wisatas: true }, }); return res.status(201).json({ data: dataKecamatan, }); } catch (error) { next(error); } } }; |
Di sini controller berfungsi sebagai proses transaksi dan logika pemrosesan data, di Controller ada beberapa istilah fungsi seperti create (untuk membuat sebuah data), update (untuk merubah sebuah data), destroy (untuk menghapus atau delete), getall (untuk mengambil semua data) dan get by ID (untuk menampikan detail dari sebuah informasi yang tersimpan pada database ANda.)
Berikut Rinciannya:
- Create buat kita buat data
- GetAll buat baca data semua
- Getbyid buat baca data perid
- Update buat kita update data
- Delete buat kita delete data