PHP

Doctrine ORM framework

14. Ledna 2010

Doctrine je ORM (Object Relation Mapper) framework pro PHP. K čemu takový framework slouží? Stejně jako u všech frameworků, je důležité, si položit otázku: "Potřebuji framework, nebo mi stačí light-weight knihovna?", aby jste si na tuto otázku dokázali odpovědět, je určitě dobré vědět co takový ORM Framework dělá. Databázové vrstvy mají jednoduchý úkol, ulehčit psaní SQL dotazů a sem tam i něco více. Hlavní sílou Doctrine ORM je jeho objektový přístup. Představte si select z tabulky jako objekt, se kterým můžete nadále pracovat, předávat ho a tak dále. Další výhodou Doctrine je tvorba databázových schémat a migrací pomocí (YAML) schémat.

Doctrine byl inspirován jeho Javovským kolegou (Hibernate), pokud jste se s Hibernate někdy setkali, práce s Doctrine by pro vás měla být hračkou. Na začátek doporučuji stáhnout již hotový sandbox, který velice snadno nainstalujete a můžete si hrát. Doporučuji si projít i krátký tutoriál, který se na webu také nachází. Bohužel dokumentace Doctrine je na velmi špatné úrovni a to je například jeden z důvodů, proč bych se zde tomuto frameworku chtěl pravidelně věnovat. Dalším důvodem jsou jeho další přednosti, kterými například jsou : Validování, Behaviours, Rozšíření atd... Těmto tématům, bych se chtěl věnovat v příštích článcích.

Dnes bych se chtěl věnovat především tvorbě schémat a všem běžným úkonům nad DB. Předpokládejme, že máte sandbox nainstalovaný (nakonfigurovaný pro vaši DB) a víte jak spouštět Doctrine z příkazové řádky.

 

YAML


Vytvoříme si toto jednoduché schéma.


Users:
    tableName: uzivatele
    columns:
         id:
             primary: true
             autoincrement: true
             type: integer(4)
         firstName: string(250)
         lastName: string(250)
    relations:
        AdressBook:
            type: mamy
            local: id
            foreign: user_id
           
AdressBook:
    columns:
        id:
            primary: true
            autoincrement: true
            type: integer(4)
        user_id: integer(4)
        content: string(60)
        kind: string(10);       
    relations:
        Users:
            local: user_id
            foreign: id

Uložením souboru a následným spuštěním "build-all-load" zkompilujete YAML schéma, vygenerují se vám PHP třídy a v databázi se vytvoří tabulky.

Vytvořili jsme dvě velice jednoduché tabulky uzivatele(id,name) a adressbook(id,user_id, content, kind), které jsou v relaci "one has many".

Takto vytvořené schéma budeme používat pro demonstrativní účely, budeme vytvářet uživatele a každému můžeme přiřadit email,telefonní číslo,skype atd.

 

Práce s DB


Opět předpokládám že máte Doctrine nainstalovaný a modely vygenerované a uložené na správných místech.

Insert
  1. $user = new Users();
  2. $user->firstName = 'Josef';
  3. $user->lastName = 'Novák';
  4. $user->Phonebook[0]->content = 'novak@dominoo.cz';
  5. $user->PhoneBook[0]->kind = 'email';
  6. $user->save();


Takto vypadá příklad insertu do DB. Přestože vkládáme do tabulky uživatelů, můžeme kvůli nastavené relaci vložit řádek do tabulky PhoneBook, aniž by jsme znali id právě vytvářeného uživatele. Po vykonání příkazu save(), si můžete velice snadno id tohoto uživatele zjistit přes objekt $user->id.

Update
  1. $array = array("firstName" => "Karel", "lastName" => "Strnad");
  2.  
  3. $user = Doctrine::getTable("Users")->find(1);
  4. $user->fromArray($array) ;// naplnime objekt hodnotami z pole
  5. $user->AdressBook[0]->content = "strnad@dominoo.cz";
  6. $user->save();
  7.  

Na updatu jsem chtěl demonstrovat hned několik věcí. Výběr řádku můžeme provést přes statickou metodu getTable pokud známe id, nebo jine kriterium.
Řádka se nám hned uloží do objektu, s kterým, můžeme nadále pracovat. Na naplnění dat jsem použil funkci fromArray, která naplní data do objektu pomocí indexů v poli. Nakonec jsem ještě změnil email (v praxi předpokládejme, že si id AdressBooku zjistíme) a celé opět uložíme.        

Delete
  1. $user = Doctrine_Query::create()
  2. ->delete("Users u")
  3. ->where("u.id = ?",1)
  4. ->execute();


       
Zde jsme poprvé použili DQL v akci. Delete je velice jednoduchý a k tomuto příkladu ani není co dodat, možná jen aby jste, si dostudovali, co vše se dá při stavbě dotazu použít.       

Select
  1.  
  2. $users = Doctrine_Query::create()
  3. ->from("Users u")
  4. ->select("u.firstName")
  5. ->leftJoin("u.AdressBook ua")
  6. ->orderBy("ua.kind DESC")
  7. ->execute()
  8. ->toArray();


Na závěr jsem si připravil tvorbu select dotazu a myslím že jeho obsah je mluví sám za sebe a není třeba ho nějak více popisovat. Možná za zmínku stojí funkce toArray, která objekt převede na pole, protože ne vždy, je použití objektu vhodnější.

 

Závěrem


Doctrine ORM považuji za velice výkonný nástroj. Dnes jsem vám ukázal, pouze jak se vytváří základní dotazy a v příštích článcích, bych chtěl pokračovat v seznamování Vás s tímto frameworkem. Přimo na stránkách projektu je ke stažení cheatsheet, který, můžu jen doporučit.

 

Ohodnoť článek
Ohodnoťte článek.
zend

Přidat příspěvěk

captcha
zend

Diskuze

Petr Bobek 24. Dubna 17:07 EmailWeb

Ahoj, díky za super mini seriálek ohledně Doctrine. V jedné věci s tebou ale nemůžu souhlasit a to s tvrzením, že Doctrine má špatně zpracovanou dokumentaci. Myslím, že příkladů je tam u všeho dost. :) Kdyby měl někdo zájem má staženou i PDF verzi cele dokumentace. Klidně písněte maila a PDF přepošlu. Petr

Dominoo 27. Května 03:16 EmailWeb

Ahoj, jsem moc rád, že aspoň někomu se ten to mini seriálek hodí. Určitě v něm budu pokračovat jen sem měl teď trošku více práce. Asi jsem se nevyjádřil uplně přesně, Doctrine má pěknou dokumentaci ale rozhodně ne moc kompletní. Na ty nejzákladnější věci jsou tam i ukázky, ale mě přijde že dokumentace zdaleko nepokrývá celou knihovnu a všechny její funkce. To samé oficiální pluginy, člověk občas musi prolézat zdrojáky, aby vůbec našel to co hledá. Dokumentaci jsem teda asi 3 měsíce neviděl, možná se to zlepšilo :) Doufejme.

Copyright © 2011 Dominik Veselý & CodingWalrus | Designed by Tryst

Kategorie

Hledat