M-N (many-to-many) relationship di tiOPF

Pemrograman menggunakan Free Pascal dan Lazarus

M-N (many-to-many) relationship di tiOPF

Postby leledumbo » 07 Apr 2012, 01:38

* Menghangatkan kembali forum yang sudah mulai dingin

Ane lagi bikin web app pake fcl-web + tiOPF, servernya embedded pake THTTPServerApplication dari fphttpapp (ada di project menunya lazarus udah beberapa bulan terakhir). Secara ane dulunya maenan PHP buat web, jadi agak kebawa-bawa konsep framework yang dulu ane doyan banget make. Tapi menurut ane konsep nyang satu ini gak spesifik PHP sih, jadi kebawa-bawa gapapa lah ya.

Jadi problemnya, ane punya tabel2 begini:
Code: Select all
  1. CREATE TABLE users (

  2.   id INTEGER PRIMARY KEY,

  3.   name VARCHAR(30),

  4.   password VARCHAR(30)

  5. );

  6.  

  7. CREATE TABLE roles (

  8.   id INTEGER PRIMARY KEY,

  9.   name VARCHAR(20)

  10. );

  11.  

  12. CREATE TABLE users_roles (

  13.   id INTEGER PRIMARY KEY,

  14.   user_id INT,

  15.   role_id INT,

  16.   FOREIGN KEY(user_id) REFERENCES users(id),

  17.   FOREIGN KEY(role_id) REFERENCES roles(id)

  18. );


Karena hubungan users sama roles itu m-n, jadi mappingnya pake tabel ke-3. Kebetulan automappingnya tiOPF gak terlalu support m-n. Terus ane nanya sama om Graeme (yang bikin), doi nawarin solusi buat make hardcoded visitor ato relationship manager pattern. Yang pertama gak sreg sama ane coz ane mau ngindarin direct sql, yang kedua ngeliat contoh di folder quarantinenya tiOPF agak2 mudeng, tapi kok kayaknya kurang cantik coz ada parameter tambahan which is jenis hubungannya: antara apa n apa, direpresentasiin sebagai integer (yang harus ane maintain sendiri sebagai value unik buat setiap hubungan).

Karena belom dapet yang sreg, ane override method Read buat baca users, di mana abis baca data user2nya, ane manual ngambil role2 yang terkait sama masing2 user terus diassign ke user tersebut. Kalo agak ngawang, kodenya gini:
Code: Select all
  1. procedure TUsers.Read;

  2. var

  3.   i,j: Integer;

  4.   UserRoles: TUserRoles;

  5. begin

  6.   inherited Read;

  7.   for i := 0 to Count - 1 do begin

  8.     UserRoles := TUserRoles.Create;

  9.     UserRoles.Criteria.ClearAll;

  10.     // cari baris di users_roles yang kolom user_id nya sama kayak OID user sekarang (Items[i])

  11.     UserRoles.Criteria.AddEqualTo('user_id',Items[i].OID.AsVariant);

  12.     UserRoles.Read;

  13.     // nah, di atas kan cuma dapet dalem bentuk id, sekarang kita ambil objeknya dari tabel roles

  14.     Items[i].Roles := TRoles.Create;

  15.     for j := 0 to UserRoles.Count - 1 do

  16.       Items[i].Roles.Criteria.AddEqualTo('id',UserRoles[j].RoleID);

  17.     Items[i].Roles.Read;

  18.  

  19.     UserRoles.Free;

  20.   end;

  21. end;


Kira2 ada yang punya solusi lain yang lebih cantik n ciamik? Matur nuwun...
leledumbo
Senior Member
 
Posts: 262
Joined: 24 May 2010, 15:58

Re: M-N (many-to-many) relationship di tiOPF

Postby D.E » 16 Apr 2012, 22:31

Pake JOIN kenapa?
Gak tau gimana notasinya kalau pake tiOPF
User avatar
D.E
Senior Member
 
Posts: 638
Joined: 04 May 2010, 18:12

Re: M-N (many-to-many) relationship di tiOPF

Postby leledumbo » 17 Apr 2012, 22:41

e zustru... kalo direct SQL mah tinggal JOIN, tapi kan itu yang lagi dihindarin... emang kalah speed sih jadinya, tapi jadinya gonta-ganti backend tinggal ganti define doank, gak keiket sama SQL (apalagi implementasi tertentu).
leledumbo
Senior Member
 
Posts: 262
Joined: 24 May 2010, 15:58


Who is online

Users browsing this forum: No registered users and 1 guest

cron