Skip to content
uestla edited this page May 12, 2013 · 3 revisions

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.

Property

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, že Orm\Entity tuto property již obsahuje - není ji tedy třeba explicitně vyjmenovávat.

Základní (skalární) property

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).

Vazební property (asociace)

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í.

M:1 - ManyToOne

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.

1:1 - OneToOne

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 ...}.

1:M - OneToMany

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}
  1. 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.
  2. Místo Orm\OneToMany lze také uvést jejího libovolného potomka, do kterého si můžeme doplnit vlastní funkcionalitu.

M:M - ManyToMany

... doplnit ...

Nepovinná property

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.

Clone this wiki locally