Drupal 7 - Rad sa bazom podataka preko PHP PDO
Sa prelaskom na Drupal 7 prelazimo na novi Drupal DB sloj apstrakcije (DB abstraction layer) koji je baziran na PDO. PDO se već dugo koristi u Zend framework-u, kao i u mnogim drugim PHP framework-ovima. Sve je bilo dobro u Drupalu 6 sa pisanjem SQL upita, zašto nam onda nešto novo?
Za početak, hajde da objasnimo šta je PDO.
Rad sa bazom podataka u Drupal 7 - lekcija 1 - Drupal DB API
Ako ste pisali module za Drupal verziju 6, prelazak na novi Drupal 7 Database API neće vam predstavljati problem. Novi DB API radi na osnovu PHP PDO ekstenzije, što mu omogućava rad sa različitim bazama podataka kao što su MySQL, PostgreSQL, MSSQL, pa čak i Oracle. Što se tiče jednostavnosti, teško je reći, jer je potrebno naviknuti se na novi sintaksis, dok je pisanje SQL upita i dalje intuitivnije.
Evo malo iz zvanične dokumentacije:
Rad sa bazom podataka u Drupal 7 - lekcija 2 - Konfiguracija baze podataka
Glavni način za definisanje konekcije sa bazom podataka je niz $databases u fajlu settings.php. Kao što i samo ime kaže, $databases omogućava definisanje više konekcija sa bazama podataka. Takođe podržava definisanje više ciljeva (targets). Konekcija se ne otvara (objekat konekcije se ne kreira) dok prvi put neki deo koda ne izvrši upit ka bazi.
Rad sa bazom podataka u Drupal 7 - lekcija 3 - Statički upiti (SELECT)
Najčešći oblik upita u Drupalu je statički upit. Statički upit se doslovno prosleđuje bazi podataka. Samo SELECT upit može biti statički. Statičke upite treba koristiti samo u vrlo jednostavnim slučajevima. Trebalo bi da koristite dinamičke upite kada treba da napišete složen upit, dinamički kreiran ili izmenjen nakon izvršenja. Jednostavan način da izvršite statički upit je preko metode query objekta:
<?php $result = $conn->query("SELECT nid, title FROM {node}"); ?>
Proceduralni wrapper je poželjniji:
Rad sa bazom podataka u Drupal 7 - lekcija 4 - Dinamički upiti (SELECT)
Verovatno smo stigli do najzanimljivijeg dela Drupal Database API-ja: dinamički upiti. Dinamički upiti se tako zovu jer Drupal dinamički dodaje delove upita. Svi INSERT, UPDATE, DELETE ili MERGE upiti mogu biti dinamički. SELECT upiti mogu biti i dinamički i statički. Ipak, preporučuje se korišćenje dinamičkih upita i za SELECT upite.
Rad sa bazom podataka u Drupal 7 - lekcija 5 - Extenders (Proširenja)
Upiti za izbor podržavaju proširenja (extenders). Proširenje omogućava dodavanje funkcionalnosti na upit za izbor tokom izvršenja. Ova funkcionalnost može biti dodatna metoda ili obrada ponašanja postojeće metode.
Za ovo se koriste OOP obrasci (design patterns), proširenja su implementirana po Decorator obrascu. Ona dodaju dodatne odgovornosti dinamičkom objektu kroz fleksibilnu alternativu podklase za proširenje metode.
Rad sa bazom podataka u Drupal 7 - lekcija 6 - Izmena upita u letu (hook_query_alter)
Važna osobina dinamičkih SELECT upita je mogućnost da drugi moduli menjaju upite „u letu“. Ovo omogućava drugim modulima da ubacuju svoje instrukcije u upit, čime utiču na njegovo ponašanje ili primenjuju promene tokom izvršavanja upita, na primer za definisanje prava pristupa nodovima. Postoje tri komponente za izmene upita u letu: tagging (označavanje), meta podaci i hook_query_alter().
Rad sa bazom podataka u Drupal 7 - lekcija 7 - Obrada rezultata upita (fetch)
Upit za selekciju uvek vraća rezultat obrade upita kao 0 ili više zapisa. Postoji nekoliko načina da se obrade podaci iz rezultata upita, koje možete koristiti prema sopstvenoj proceni.
Najčešće se rezultati koriste u vidu petlje foreach().
Rad sa bazom podataka u Drupal 7 - lekcija 8 - INSERT INTO upiti (ubacivanje)
INSERT upiti uvek treba da koriste konstruktor upita. Neke baze podataka zahtevaju specijalne tretmane za LOB (Large OBject, poput TEXT u MySQL) i BLOB (Binary Large OBject) polja, pa je potreban nivo apstrakcije za pojedinačne drajvere baza da implementiraju ove tretmane.
INSERT upiti počinju korišćenjem funkcije db_insert():
Rad sa bazom podataka u Drupal 7 - lekcija 9 - UPDATE upiti (ažuriranje)
UPDATE upiti uvek treba da koriste konstruktor upita. Različite baze podataka imaju specifične tretmane za LOB (Large OBject, kao što je TEXT u MySQL) i BLOB polja (Binary Large OBject), pa je potreban nivo apstrakcije za pojedinačne drajvere da implementiraju specifične tretmane.
UPDATE upiti počinju funkcijom db_update():