A doctrine használatáról kicsit bővebben akarok írni, ezért több részben teszem meg. Előző posztomban már leírtam, hogy hogyan lehet implementálni ( asszem ez a helyes szó erre ) a doctrine-t a ZF -be. Nem törekszek a részletes leírásra, nem is menne, nem vagyok tanár. olvass utánna, csak segítséget nyújtok. De ha kérdésed van, várom hozzászólásban.
Most essen szó, az adatbázis felépítéséről. Doctrine-ben az adatbázist YAML fájlban (.yml) lehet leírni, megadni a táblákat, relációkat, mezők tipusát. A hogyant itt, a doctrine oldalán eltudod olvasni.
Ha nincsenek relációk a táblák között, akkor nagyon egyszerü egy tábla leírása yml formában:
táblaneve: columns: mező_neve: type: tipus(méret)
Gondolom feltünt, hogy a táblanévhez képest a mező neve 2 db szóközzel van beljebb, és a mező névhez képest a tipus ismét két szöközzel van beljebb. Ezt a formát mindig megkell tartani, azzal hogy beljebb van, jelezzük pl, hogy a type attributum a mező_neve -hez tartozik, ha két szóközzel kijebb lenne, akkor a columns -hez tartozna.
Idegesítő, nehéz és lassú lenne az adatbázist így, közvetlenül a yaml fájl szerkesztésével elkészíteni, ezért ajánlom mindenki figyelmébe az ORM Designer -t. Fizetős, de 15 nap próba verzió teljes értékü ( és mondjuk virtualbox -ban az állapot mentése csodákra képes ) de ha megtetszik és rendszeresen dolgozol vele, vedd meg.
A táblákat és a táblák közötti kapcsolatot ( az Ms Accashez hasonlóan ) grafikus felületen lehet megtervezni. Praktikus, és gyors. Közvetlenül elmenti a megtervezett adatbázist a doctrine számára yml formába.
Táblák létrehozása yml fájlból
neten fent van sok helyen, de azért leírom:
//db törlélse Doctrine::dropDatabases(); //db létrehozása Doctrine::createDatabases(); //modellek legenerálása yml fájlból, modelsPath egy létezö, írható //könyvtár legyen Doctrine::generateModelsFromYaml( $ymlFile , $modelsPath ); //a modellekből létrehozza az adatbázis táblákat Doctrine::createTablesFromModels( $modelsPath );
Ennyi az egész. Vigyázat! rögtön az elején törli az aktuális kapcsolatban beállított adatbázist, majd létrehozza ( így törölve az öszes előző adatot ).
Rekordok hozzáadása a táblához:
van egy táblánk, aminek a definiciója így néz ki:
User: columns: id: primary: true unique: true type: integer notnull: true autoincrement: true username: string(255) password: string(255)
A doctrine létrehoz egy User nevü osztályt, ez az osztály fogja egy rekordját reprezentálni a táblának. A User osztálynak 3 tulajdonsága van, id, username és password.
$user = new User(); $user->username = 'teszt'; $user->password = 'jelszo'; $user->save();
Ennyi az egész, ha egy új rekordot akarunk felvenni. a save() eljárás meghívása fontos, ekkor történik a rekord elmentése (elméletileg unset hatására automatikusan meghívódik )
Rekord kiolvasása táblából
Ezt több módon is megtehetjük.
$user = Doctrine_Manager::connection()->getTable( 'User' )->find( $id );
Ahol az id az elsődleges kulcs. Lehet keresni bármely mező alapján is, az sql parancs where részét megadva, kicsit módosítva, DQL -nek nevezi a doctrine.
$users = Doctrine_Manager::connection() ->getTable( 'User' ) ->findByDql( 'username = ? AND password = ?' , array( $username , $password ) );
Ilyen formában megadva a keresést, a két változót, $username, $password , autómatikusan ellenörzi és meggátolja, hogy rajta keresztül sql kódot lehessen beszurni. A kérdőjelek helyére lesz beillesztve, sorrendben a két véltozó, ami tömbként lett átadva. Ha csak egy változónk van ( egy kérdőjel ) , simán, array nélkül is átlehet adni.
Gondolom feltünt, hogy a változó neve, amiben a rekordot tárolom, $user -ből $users lett. Ez azért történt, mert a findByDql nem egy rekordot ad vissza ( fenti példában jó esetben csak egyet, de akár több is lehetne ). Egy Doctrine_Collection osztályt ad vissza, ami több rekord gyüjtője. Fontosabb müveletek, amit ezzel az objektummal tenni tudunk, és amivel kitudjuk szedni belőle a rekordokat:
Ha tudjuk, hogy max 1 rekordot kapunk, vagy 1-et sem ( fenti példa ilyen ):
// count() fügvény megmondja, hogy hány rekord van a collection-ben if( $users->count() == 1 ) { // getFirst() a legelső recordot adja vissza $user = $users->getFirst(); /** * do stuffs $user -el */ } //Ha x darab rekordunk van if( $users->count() > 0 ) { foreach( $users as $user ) { /** * do stuffs $user -el */ } }
Kövi részben az adat táblák közötti relációkról írok pár sort.