FastPlaz

FastPlaz

  • Docs
  • MVC
  • ORM
  • FTE
  • Help
  • Release

β€ΊKonsep & Fitur

Pengantar

  • Ctrl+Alt+Del
  • Arsitektur (MVC)
  • Instalasi

Konsep & Fitur

  • ORM
  • Template Engine
  • Variabel Global
  • Method
  • Helper
  • Common Function

Penggunaan

  • Create New Project
  • Controller
  • Model
  • Routing

Latihan

  • Default Package
  • Akses Database
  • API (echo)
  • REST API

Showcase

  • Showcase
  • Gallery

Utilitas

  • Database Explorer
  • JSON Validator
  • Regex Tester
  • Reveal in Explorer/Finder

ORM (Object Relationship Mapping)

Object Relationship Mapping adalah sebuah teknik yang digunakan dalam pemrograman untuk menggunakan basisdata relasional sebagai penyimpanan data dengan bentuk objek. Teknik ini biasa digunakan dalam bahasa pemrograman berorientasi objek saat harus menggunakan basisdata relasional dalam penyimpanannya.

FastPlaz menyediakan Simple ORM untuk mengakomodir hal-hal di atas, khususnya untuk penggunaan CRUD sederhana.

Database yang saat ini didukung sesuai dengan yang didukung oleh Free Pascal, yaitu:

  • Firebird
  • MySQL
  • ODBC
  • Oracle
  • PostgreSQL
  • SQLite3

Dan dapat dipilih melalui konfigurasi di config.json.

Model

Langkah pertama dalam menghubungkan aplikasi ke database adalah dengan membuat Model.

Dimisalkan terdapat tabel dengan nama contacts, maka kode sumber model fastplaz akan seperti berikut.

 TContactModel = class(TSimpleModel)
 private
 public
   constructor Create(const DefaultTableName: string = '');
 end;

.
.
.

constructor TContactModel.Create(const DefaultTableName: string = '');
begin
  inherited Create( DefaultTableName); // table name = contacts
  //inherited Create('yourtablename'); // if use custom tablename
end;

Nama Tabel Default

Pemodelan di FastPlaz menggunakan Plural Methods. Jadi bisa diartikan:

  • TContactModel πŸ‘‰ nama tabelnya: contacts
  • TBuildingModel πŸ‘‰ nama tabelnya: buildings
  • TWarehouseModel πŸ‘‰ nama tabelnya: warehouses

Lalu, kalau TKaryawanModel akan merefer ke tabel karyawans? Ya, benar. Kok lucu yaa? Jangan khawatir, sudah disediakan fitur untuk melakukan kustomisasi nama.

Primary Key Default

Primary Key default mengikuti 1 huruf pertama nama tabel diikuti dengan string 'id'.

Jadi jika nama modelnya adalah TContactModel, maka:

  • Nama tabel: contacts
  • Primary key: cid

Penamaan Kustom

Anda bisa mengubah nama default tabel dan primaryKey menjadi sesuati kebutuhan Anda.

constructor TKaryawanModel.Create(const DefaultTableName: string = '');
begin
  inherited Create( DefaultTableName);
  TableName := 'karyawan'; // definikan nama tabel di sini
  primaryKey := 'id';
end;

CRUD

Seperti umumnya dalam pembuatan aplikasi yang terhubung ke database, pasti akan menyinggung hal tentang CRUD (Create Read Update Delete).

Create

Jika akan membuat data baru, cukup dengan memanggil procedure New, kemudian diikuti dengan memasukkan nilai ke dalam field, dengan format:

contact['field_name'] := 'value';

Sehingga akan menjadi seperti berikut:

// create new data

contact := TContactModel.Create();
contact.New;
contact['field_name'] := 'value';
contact['first_name'] := 'Luri';
contact['last_name'] := 'Luri';
contact['address'] := 'Alamat Lengkap Saya';
contact['status_id'] := 0;
if not contact.Save() then
begin
  //
  // terjadi kegagalan dalam menyimpan data
  //
end;
contact.Free;

Read

Pola membaca nilai dari suatu field bisa dilakukan dengan format berikut:

variableName := contact['field_name'];

Fungsi/metode yang tersedia:

  • All, mendapatkan seluruh baris data
  • Find(...), mendapatkan data dengan kondisi tertentu
  • FindFirst(...), mendapatkan data pertama dengan kondisi tertentu.
// mendapatkan seluruh baris data
contact := TContactModel.Create();
if contact.All then
begin
  //
  // data ditemukan
  //
end;
// mencari data dengan field primaryKey = 2
if contact.Find(2) then
begin

  // data ditemukan
  firstName := contact['first_name'];

end;
// pencarian data dengan pengkodisian
var
  whereAsArray: TStringArray;

.
. 
whereAsArray.Add('first_name="luri"');
if contact.Find(whereAsArray) then
begin
  //
  // data ditemukan
  //
end;
// pencarian data dengan pengkodisian, order dan limitasi
// order by name
// limit 10 offset 90
var
  fieldList: string;
  whereAsArray: TStringArray;

.
. 
whereAsArray.Add('first_name="luri"');
fieldList := 'cid, name, address, status';
if contact.Find(whereAsArray, 'name', 10, fieldList, 90) then
begin
  //
  // data ditemukan
  //
end;

Join Table

Join terhadap beberapa tabel lain pun bisa dilakukan dengan mudah. Tambahkan kode berikut sebelum perintah pencariaan.

contact.AddJoin('reference_table', 'reference_field', 'join_field', 
  ['field_name1','field_name2 alias_name']);

Contoh lengkapnya akan seperti berikut:

// condition & join

whereAsArray.Add('first_name="luri”');

contact.AddJoin('locations', 'id', 'contacts.location_id', 
  ['code','name country']);

if contact.Find(whereAsArray) then
begin
  //
  // data ditemukan
  //
end;

Update

Cara update data hampir mirip dengan Create. Bisa diawali dengan pencarian data, lalu ubah data seperti contoh kode berikut:


// find and update
// mencari data kontak dengan field primary key = 6

if contact.Find(6) then
begin
  s := contact['first_name'];

  contact['first_name'] := 'Budi';// ubah nama menjadi "Budi"
  if contact.Update() then
  begin

    // proses update berhasil

  end;

end;

Delete

// delete with index

if contact.Delete(6) then
begin
  //
end;

// delete with condition
var
  whereAsArray: TStringArray;

.
.

whereAsArray.Add('status_id=1');
if contact.Delete(whereAsArray) then
begin
  //
end;

// delete with Find function
var
  whereAsArray: TStringArray;

.
.

whereAsArray.Add('status_id=1');
if contact.FindFirst(whereAsArray) then
begin
  // do something

  Delete();
end;

Query Builder

Salah satu hal yang menyenangkan dari Simple ORM di FastPlaz ini adalah tersedianya Query Builder. Di dalam prosesnya Query Builder akan menghasilkan baris SQL (MySQL) untuk kemudian dieksekusi.

// query builder

contact := TContactModel.Create();
if contact.Select('first_name')
  .Where('status_id=0')
  .OrderBy('first_name')
  .Limit(10)
  .Open() then
begin

  //

end;

Di dalam prosesnya, perintah ini akan menghasilkan Query SQL:

SELECT first_name 
FROM contacts 
WHERE status_id=0 
ORDER BY first_name 
LIMIT 10

Mengolah Data

Di atas telah disampaikan cara nntuk menulis dan membaca single row data. Lalu bagaimana jika akan mengolah data yang berisi beberapa record data? Anda bisa gunakan metode perulangan yang sudah tersedia di Pascal, seperti for...do, repeat...until ataupun while...do.

for i := 1 to contact.RecordCount do
begin
  firstName := contact['first_name'];

  // your code here

  contact.Next; // menuju ke baris record berikutnya
end;
repeat
  firstName := contact['first_name'];

  // your code here

  contact.Next; // menuju ke baris record berikutnya
until warehouses.EOF;
while not contact.EOF do
begin
  firstName := contact['first_name'];

  // your code here

  contact.Next; // menuju ke baris record berikutnya
end;

Baris-baris kode di atas akan sangat bermanfaat jika anda akan melakukan pengolahan data di dalam controller.

Menampilkan Data

Pada dasarnya proses Pengolahan Data tidak selalu diperlukan jika hanya sekedar untuk menampikan data tersebut ke user. Dengan menggunakan FTE/FastPlaz Template Engine, hal tersebut cukup dilakukan dengan mendefinisikan variabel data yang akan dikirim ke view.

Contoh kasus, jika ada suatu aplikasi yang hendak menampilkan isi tabel warehouses, maka yang semestinya dilakukan:

Membuat kode pascal untuk akses ke model warehouse

// kode di warehouse controller
// di prosedur Create telah didefiniskan baris berikut
//   warehouses := TWarehouseModel.Create();  

procedure TWarehouseController.Get;
var
  whereAsArray: TStringArray;
begin
  DataBaseInit(); // inisialisasi koneksi ke database

  warehouses.AddJoin('locations', 'id', 
    'warehouses.location_id', 
    ['code','name country']);
  if not warehouses.Find(whereAsArray) then
  begin
    //
  end;

  // Assign data warehouses ke variable $Warehouses
  //   untuk dipakai di view
  ThemeUtil.AssignVar['$Warehouses'] := @warehouses.Data;

  Tags['maincontent'] := @Tag_MainContent_Handler; //<<-- tag maincontent handler
  ThemeUtil.Assign('$Title', 'DB Model');
  ThemeUtil.Layout := 'master'; // custom layout: master.html
  Response.Content := ThemeUtil.Render();
end;

Kode HTML di view

Dan kode HTML di bagian view cukup seperti berikut:

<table>
    <thead>
        <tr><th>&nbsp;</th><th>Code</th><th>Name</th><th>Country</th></tr>
    </thead>
    <tbody>
        [foreach from=$Warehouses item=aItem type=table]
        <tr><td>[$index].</td><td>[aItem.code]</td><td>[aItem.name]</td><td>[aItem.country]</td></tr>
        [/foreach from=$Warehouses]
    </tbody>
</table>

Informasi tentang penggunaan tag foreach bisa dipelajari di bagian FTE

Dan hasilnya kurang lebih akan seperti ini ORM View

Contoh ini adalah contoh yang sederhana hanya dengan menggunakan "<table>..</table>" saja. Untuk penggunaan yang lebih menarik bisa memanfaatkan Ajax dengan menggunakan pustaka JS/CSS yang sudah ada.

Contoh yang lebih komplek bisa dipelajari di kode sumber di repositori Database-Example.

Lebih dalam tentang penggunaan templating ini bisa dipelajari di bagian FastPlaz Templating Engine.

Ilustrasi

ORM View

← InstalasiTemplate Engine β†’
  • Model
    • Nama Tabel Default
    • Primary Key Default
    • Penamaan Kustom
  • CRUD
    • Create
    • Read
    • Update
    • Delete
  • Query Builder
  • Mengolah Data
  • Menampilkan Data
    • Membuat kode pascal untuk akses ke model warehouse
    • Kode HTML di view
    • Ilustrasi
FastPlaz
Docs
Getting StartedFastPlaz Theme EngineContribution
Community
User ShowcasePascal IndonesiaPascal Indonesia on Telegram
More
BlogGitHubStar
FastPlaz Web Framework
Copyright Β© 2023 FastPlaz - Built with Docusaurus