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.