Object-Relational Mapper for PHP IStorable Object-Relational Mapper for PHP
Plan prezentacji Strukturalne podejście do zapisywania bytów w relacyjnej bazie danych Podejście obiektowe Projekt IStorable Klasa IStorableImplBase Zapisywanie Odczytywanie I wiele innych sprytnych rzeczy Copyright © Rafal Skoczylas
Tradycyjne podejście Byty odseparowane od sposobu ich zapisywania przechowywania Ręczne zapisywanie bytów oraz powiązań między nimi Ręczne odczytywanie z bazy i mapowanie na byty Copyright © Rafal Skoczylas
Książka adresowa class Address { public $id; public $street; public $city; } class Person public $name; public $age; public $address; Copyright © Rafal Skoczylas
Tradycyjne zapisywanie $db = new PDO("sqlite://plik.db"); $p = new Person(); $p->address = new Address(); $db->query("insert into Address(street, city) values('".$p->address->street."', '".$p->address->city."')"); $db->query("insert into Person(name, age, address) values('".$p->name."', '".$p->age."', $db->lastInsertId)"); Copyright © Rafal Skoczylas
IStorableImplBase class Address extends IStorableImplBase { public $street; public $city; } class Person extends IStorableImplBase public $name; public $age; public $address; Copyright © Rafal Skoczylas
Zapisywanie z IStorable $db = new PDO("sqlite://plik.db"); $p = new Person($db); $p->address = new Address($db); $p->Store(); Copyright © Rafal Skoczylas
Tradycyjne odczytywanie $a = new Address(); $p = new Person(); $db = new PDO("sqlite://plik.db"); $row = $db->query("select name, age, address from Person where name = 'Smith'")->FetchAll(); $p->name = $row['name']; $p->name = $row['age']; $row = $db->query("select street, city from Address where id = ".$row['address'])->FetchAll(); $a->street = $row['street’]; $a->city = $row['city’]; $p->address = $a; Copyright © Rafal Skoczylas
IStorable - Odczytywanie $db = new PDO("sqlite://plik.db"); $p = IStorableLoader::Load('Person', 'name', 'Smith'); Copyright © Rafal Skoczylas
Kontrola zawartości zmiennych Run-time content checking class Person { public /** @regex: ^[a-zA-Z0-9]+$ */ $name; } Run-time type checking public /** @object: Address */ $obiekt_typu_Address; public /** @object?: Address */ $obiekt_typu_Address_lub_null; public /** @array: Address */ $tablica_Addressow; public /** @array?: Address */ $tablica_Addressow_lub_null; Copyright © Rafal Skoczylas
Jeszcze więcej… Kaskadowe usuwanie obiektów class Person { public /** @cascade; @object: Address */ $address; } $p = new Person($db); $p->address = new Address($db); $p->Store(); $p->Delete(); /* usuwa również $p->address */ Copyright © Rafal Skoczylas
Lazy loading class Person { public /** @regex: ^[a-zA-Z0-9]+$ */ $name; public /** @object: Address */ $address; } $p = IStorableLoader::Load('Person', 'id', 21); /* $p->address nie jest od razu ładowane z bazy; dopiero podczas pierwszego użycia: */ echo $p->address->$street; Copyright © Rafal Skoczylas
Oraz kilka innych $p->CreateTables() – na podstawie definicji klasy, tworzy odpowiedni schemat bazy danych, tak aby można było zapisać obiekt $p i kilka innych ciekawych rzeczy Klasa dostępna jest pod adresem http://rafal.skoczylas.pl/IStorable/IStorable.inc Dokumentacja i większe możliwości wkrótce ;-) Copyright © Rafal Skoczylas
Dziękuję