1 Object-Relational Mapper for PHPIStorable Object-Relational Mapper for PHP
2 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
3 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
4 Książka adresowa class Address { public $id; public $street;public $city; } class Person public $name; public $age; public $address; Copyright © Rafal Skoczylas
5 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
6 IStorableImplBase class Address extends IStorableImplBase {public $street; public $city; } class Person extends IStorableImplBase public $name; public $age; public $address; Copyright © Rafal Skoczylas
7 Zapisywanie z IStorable$db = new PDO("sqlite://plik.db"); $p = new Person($db); $p->address = new Address($db); $p->Store(); Copyright © Rafal Skoczylas
8 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
9 IStorable - Odczytywanie$db = new PDO("sqlite://plik.db"); $p = IStorableLoader::Load('Person', 'name', 'Smith'); Copyright © Rafal Skoczylas
10 Kontrola zawartości zmiennychRun-time content checking class Person { public ^[a-zA-Z0-9]+$ */ $name; } Run-time type checking public Address */ $obiekt_typu_Address; public Address */ $obiekt_typu_Address_lub_null; public Address */ $tablica_Addressow; public Address */ $tablica_Addressow_lub_null; Copyright © Rafal Skoczylas
11 Jeszcze więcej… Kaskadowe usuwanie obiektów class Person {Address */ $address; } $p = new Person($db); $p->address = new Address($db); $p->Store(); $p->Delete(); /* usuwa również $p->address */ Copyright © Rafal Skoczylas
12 Lazy loading class Person {public ^[a-zA-Z0-9]+$ */ $name; public 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
13 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 Dokumentacja i większe możliwości wkrótce ;-) Copyright © Rafal Skoczylas
14 Dziękuję