-
Notifications
You must be signed in to change notification settings - Fork 2
CS: Entita WIP
Každá entita by měla dědit od Orm\Entity
(v tom se liší od Doctrine 2, kde může být entitou jakákoliv třída dodržující několik omezení). Může být jakkoliv pojmenována a nacházet se v libovolném jmenném prostoru. Pro další příklady budu pracovat s entitou Book
.
Jednotlivé property se nedefinují jako členské proměnné, ale pomocí anotací. Využívá k tomu standardní dokumentační anotace, čímž zároveň ve většině IDE dodržuje podporu našeptávání. Jednoduchá ukázková entita s jedním atributem by mohla vypadat takto:
/**
* Kniha
*
* @property string $name
*/
class Book extends Orm\Entity {}
Nejprve se definuje typ, následně jméno. To je třeba uvést s dolarem ($
) na začátku, prostě dle standardu PHPDocu. Property nevyžadují žádné gettery ani settery, tuto funkcionalitu poskytuje Orm\Entity
. Ačkoliv je tedy tělo třídy prázdné, lze property číst i přiřazovat.
$book = new Book;
$book->name = 'The Screwtape Letters';
echo $book->name; // prints 'The Screwtape Letters'
Všimněte si, že nedefinuji žádnou property
$id
, která by každého logicky napadla první. To proto, žeOrm\Entity
tuto property již obsahuje - není ji tedy třeba explicitně vyjmenovávat.
Jako typ lze uvést všechna standardní dokumentační datové typy PHP kromě callable
:
string
-
int
||integer
||float
-
bool
||boolean
array
ORM se postará, aby hodnota property v entitě byla vždy uvedeného typu (ať už je entita načtena z jakéhokoliv úložiště, či je setteru poskytnuta jakákoliv přijatelná hodnota).
Asociace se od obyčejných property liší ve dvou aspektech: místo typu obsahují název třídy (buď entity, anebo implementace rozhraní vazby Orm\IRelationship
) a za názvem vyžadují ve složených závorkách několik meta-informací.
Tato vazba ukazuje na jednu entitu. Jako typ je třeba uvést třídu některé entity (včetně namespace). Přidejme si pro příklad do naší entity Book
autora. Nejprve si nadefinujeme tuto novou entitu:
/**
* Spisovatel
*
* @property string $name
*/
class Author extends Orm\Entity {}
A nyní přidáme asociaci mezi property entity Book
v následujícím formátu:
@property Author $author {m:1 Authors}
Mezi složené závorky se nejprve uvede typ asociace (v tomto případě m:1
) a následně název odpovídajícího repozitáře.
V aktuální implementaci se tato vazba chová úplně stejně jako M:1 - v budoucnu by měla být doplněna kontrola unikátnosti vazby. Zápis se liší pouze uvedením {1:1 ...}
.
Obrácena strana M:1 ukazuje na kolekci entit. Jako typ property nyní uvedeme třídu obsaženou v ORM, a to jednu z implementací Orm\IRelationship
, konkrétně Orm\OneToMany
. Do metainformací ve složených závorkách je také třeba uvést název property, která na tuto entitu ukazuje (v řeči SQL "sloupeček s cizím klíčem").
To mimochodem znamená, že ke každé vazbě 1:M musí na asociované entitě existovat inverzní vazba M:1. Naopak tomu však není.
Abychom pokračovali v příkladu s našimi entitami, zjistěme knihy, které napsal autor. Asociaci 1:M přirozeně nastavíme na entitě Author
.
@property Orm\OneToMany $books {1:m Books $author}
- Pravdou je, že třídu
Orm\OneToMany
není v definici property vůbec třeba uvádět, stačí uvést název a meta-informace (@property $books {1:m ...}
). Připravili bychom se však o napovídání IDE.- Místo
Orm\OneToMany
lze také uvést jejího libovolného potomka, do kterého si můžeme doplnit vlastní funkcionalitu.
... doplnit ...
Pokud může property zůstat nevyplněná, stačí k uvedenému datovému typu či názvu asociované třídy doplnit |NULL
. Property pak při persistenci může zůstat prázdná. NULL
není potřeba uvádět u asociací ku N: ve výchozím nastavení totiž může být prázdná (s 0 prvky) každá asociace Orm\<One|Many>ToMany
.