Optimizacija rada s bazama podataka u PHP-u: Uloga Active Record obrasca
Objavljeno: 31. ožujka 2014. | Autor: Igor Benić
Napomena: Ovaj vodič je objavljen prije više od dvije godine i možda nije u potpunosti aktualan.
Uvod u Active Record
Nastavljajući na prethodni dio vodiča u kojem smo postavili temelje za izradu bloga, ovaj dio posvećen je upoznavanju s konceptom i primjenom Active Record obrasca u PHP-u. Active Record predstavlja moćan alat koji značajno pojednostavljuje i ubrzava interakciju s bazama podataka, približavajući način rada s relacijskim bazama podataka objektno-orijentiranom programiranju.
Originalno implementiran u Ruby on Rails frameworku, Active Record obrazac omogućuje programerima da apstrahiraju kompleksnost SQL upita. Umjesto pisanja direktnih SQL naredbi za dohvaćanje, spremanje, ažuriranje ili brisanje podataka, programeri mogu koristiti jednostavne PHP objekte i metode. Svaka tablica u bazi podataka preslikava se u zasebnu PHP klasu, a svaki redak u tablici postaje instanca te klase. Atributi redaka postaju svojstva objekata, čime se postiže intuitivnije i efikasnije upravljanje podacima.
Ova biblioteka podržava širok spektar popularnih baza podataka, uključujući MySQL, SQLite, PostgreSQL i Oracle. Zahvaljujući svojoj fleksibilnosti i jednostavnosti, Active Record može biti izuzetno korisna komponenta u razvoju raznih web aplikacija, od jednostavnih blogova do složenijih sustava.
Instalacija i osnovno postavljanje Active Recorda
Za praćenje ovog vodiča, potrebno je preuzeti stabilnu verziju biblioteke Active Record. Nakon preuzimanja, raspakirajte arhivu i smjestite pripadajući folder u korijenski direktorij vašeg web poslužitelja (primjerice, u `htdocs` unutar XAMPP instalacije). Struktura direktorija unutar raspakiranog foldera trebala bi biti slična onoj prikazanoj na slici u izvornom materijalu, s ključnim datotekama i poddirektorijima potrebnim za funkcioniranje biblioteke.
Nakon što ste postavili biblioteku, možete testirati njezinu funkcionalnost. Otvorite datoteku `examples/simple/simple_with_option.php` u vašem PHP razvojnom okruženju. Unutar ove datoteke potrebno je prilagoditi varijable koje specificiraju podatke o vašoj bazi podataka. Ključne postavke uključuju korisničko ime, lozinku, host, te naziv baze podataka.
<?php
require_once dirname(__FILE__) . '/../../ActiveRecord.php'; class Post extends ActiveRecord\Model { // Explicitno definiranje naziva tablice jer naša tablica nije \"posts\" static $table_name = 'posts'; // Explicitno definiranje primarnog ključa jer naš PK nije \"id\" static $primary_key = 'id'; // Explicitno definiranje naziva konekcije jer uvijek želimo koristiti produkcijsku konekciju za ovaj model static $connection = 'development'; // Explicitno definiranje naziva baze podataka će generirati SQL poput => db.table_name static $db = 'blog';
} $connections = array( 'development' => 'mysql://root:@localhost/blog', 'production' => 'mysql://root: @localhost/blog'
); // Inicijalizacija Active Recorda
ActiveRecord\\Config::initialize(function($cfg) use ($connections) { $cfg->set_model_directory('.'); // Postavlja direktorij za modele $cfg->set_connections($connections); // Postavlja definirane konekcije
}); // Dohvaćanje i ispis atributa prvog zapisa iz tablice \"posts\"
print_r(Post::first()->attributes());
?>Ako spremljenu datoteku pristupite putem web preglednika na adresi poput `http://localhost/php-activerecord/examples/simple/simple_with_option.php`, dobit ćete ispis atributa prvog unosa iz vaše tablice `posts`. Ovo jednostavnim primjerom demonstrira kako Active Record pojednostavljuje pristup podacima bez pisanja izravnih SQL upita.
Razumijevanje koda i osnovne operacije
Analizirajmo detaljnije prethodno prikazani kod. Prvo, učitavamo datoteku koja sadrži definiciju biblioteke Active Record, čime se omogućuje korištenje njezinih funkcija. Zatim definiramo PHP klasu, u ovom slučaju `Post`, koja nasljeđuje sve funkcionalnosti iz osnovne klase `ActiveRecord\Model`. Unutar naše `Post` klase, definiramo statičke varijable koje preklapaju zadane vrijednosti iz roditeljske klase. To nam omogućuje da specificiramo tablicu u bazi podataka (`static $table_name = ‘posts’`), primarni ključ (`static $primary_key = ‘id’`), te naziv konekcije koju želimo koristiti (`static $connection = ‘development’`). Također, definiramo i naziv baze podataka (`static $db = ‘blog’`).
Definiramo array `$connections` koji sadrži konfiguracije za povezivanje s bazom podataka. U ovom primjeru, koristimo razvojnu (`development`) konekciju definirajući je s potrebnim detaljima (korisničko ime, lozinka, host i naziv baze).
Ključni korak je inicijalizacija Active Record biblioteke pozivom `ActiveRecord\Config::initialize()`. Unutar ove funkcije, postavljamo direktorij u kojem se nalaze modeli (`$cfg->set_model_directory(‘.’)`) i konfiguriramo veze s bazom podataka (`$cfg->set_connections($connections)`). Konačno, poziv `Post::first()->attributes()` dohvaća prvi zapis iz tablice `posts` i ispisuje sve njegove atribute u formatu niza.
Dohvaćanje specifičnih i svih zapisa
Za dohvaćanje drugog zapisa, umjesto `first()`, koristimo metodu `find()` s odgovarajućim ID-jem, na primjer: `print_r(Post::find(2)->attributes());`. Kako bismo dohvatili sve zapise iz tablice `posts`, koristimo metodu `all()`:
<?php
$sviClanci = Post::all();
foreach ($sviClanci as $clanak) { echo $clanak->naslov . \"<br/>\";
}
?>U ovom slučaju, svi dohvaćeni članci pohranjuju se u varijablu `$sviClanci`. Zatim iteriramo kroz ovaj niz i za svaki članak ispisujemo njegov naslov. Primjetite jednostavnost pristupa atributima – jednostavno koristimo `->naslov` kako bismo dohvatili vrijednost polja `naslov` iz svakog objekta članka. Bez Active Recorda, ovaj zadatak bi zahtijevao znatno više redaka koda i kompleksniji SQL upit.
Unos novih podataka
Unos novih podataka u bazu podataka pomoću Active Recorda jednako je intuitivan. Potrebno je kreirati novu instancu klase `Post`, dodijeliti vrijednosti njezinim svojstvima koja odgovaraju nazivima polja u tablici, te zatim pozvati metodu `save()` za pohranu.
<?php
$noviPost = new Post;
$noviPost->naslov = \"Novi Post\";
$noviPost->tekst = \"Ovo je novi tekst\";
$noviPost->sazetak = \"Ovo je novi sazetak\";
$noviPost->save();
?>Nakon izvršavanja ove skripte i osvježavanja stranice (ako ste je već koristili), novi unos će se pojaviti
