Model v tomto případě představuje vrstvu aplikace která komunikuje s databází za účelem získávání a ukládání data.
Knihovna Eloquent ORM je k dispozici jako součást velmi oblíbeného PHP frameworku Laravel. Lze ji také použít i samostatně, případně v rámci frameworku vlastního.
Eloquent ORM používá implementaci Active Record. Jedná se o způsob přístupu k datům v databázi způsobem, kdy každá třída modelu představuje jednu tabulku v databázi a každá instance této třídy představuje jeden záznam (řádek) z tabulky v databázi.
Active Record umožňuje pracovat s daty v tabulkách stejně jako s objekty tříd.
Díky tomu Eloquent ORM umožňuje vývojářům soustředit se při vývoji na „business“ logiku aplikace a nerozptylovat se psaním opakujících se SQL dotazů.
Práce s modelem v rámci knihovny Eloquent ORM je opravdu snadná a intuitivní.
Konvence pro pojmenování
- název třídy: Article
- jednotné číslo
- Camel case
- třída dědí třídu Illuminate\Database\Eloquent\Model
- název tabulky v databázi: articles
- množné číslo
- malá písmena
- název sloupce s primárním klíčem: id
- lze změnit pomocí vlastnosti třídy: protected $primaryKey
- název sloupce s cizím klíčem: article_id
Hromadné přiřazení dat
/** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['title', 'description'];
Ochrana atributů
/** * The attributes that aren't mass assignable. * * @var array */ protected $guarded = ['price'];
Případně
/** * The attributes that aren't mass assignable. * * @var array */ protected $guarded = [];
Rozsahy dotazů
//@todo https://laravel.com/docs/master/eloquent#query-scopes
Události
Eloquent model během svého životního cyklu vyhazuje následující události, které lze zachytávat a reagovat na ně.
- retrieved
- při získání existujícího modelu z databáze
- creating
- při uložení nového modelu do databáze
- created
- po uložení nového modelu do databáze
- updating
- při uložení existujícího modelu do databáze
- updated
- po uložení existujícího modelu do databáze
- saving
- při uložení nového nebo existujícího modelu do databáze
- saved
- po uložení nového nebo existujícího modelu do databáze
- deleting
- při smazání modelu z databáze
- deleted
- po smazání modelu z databáze
- restoring
- při obnovení modelu do databáze
- restored
- po obnovení modelu do databáze
Je třeba vytvořit vlastnost $dispatchesEvents, která mapuje části životního cyklu modelu Eloquentu
/** * The event map for the model. * * @var array */ protected $dispatchesEvents = [ 'saved' => App\Events\UserSaved::class, 'deleted' => App\Events\UserDeleted::class, ];
Observers
Pokud nasloucháme mnoha událostem konkrétního modelu, můžeme je všechny seskupit do jedné třídy.
//@todo https://laravel.com/docs/master/eloquent#events
Accessors
(z anglického slova access – přístup)
Accessory, podobně jako mutátory (mutators), umožňují formátovat hodnoty atributů instancí modelů Eloquentu.
/** * Get the user's first name. * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); }
- vytvoříme funkci get<NázevAtributu>Attribute()
- název metody: FirstName pro atribut first_name
Funkce Accessoru je automaticky volána při přístupu k danému atributu třídy. Hodnota atributu tak může být před jeho vrácením změněna.
Mutators
Mutátor je metoda třídy modelu, která je automaticky volána před nastavením hodnoty atributu.
metoda set<název_atributu>Attribute()
Mutátory dat
Eloquent automaticky převádí hodnoty sloupců created_at a updated_at, případně deleted_at (které představují datum vytvoření, datum poslední úpravy a případně datum smazání záznamu v databázi) na instance třídy Carbon.
Carbon je knihovna v PHP, která tvoří nástavbu pro třídu DateTime – a rozšiřuje a usnadňuje práci s daty v PHP.
Pomocí atributu $dates můžeme určit, které atributy se mají takto automaticky převádět:
/** * The attributes that should be mutated to dates. * * @var array */ protected $dates = [ 'created_at', 'updated_at', 'deleted_at' ];
Určení typů atributů
Každý atribut lze převést na požadovaný datový typ.
Dostupné datové typy jsou:
- integer, real, float, double,
- string,
- boolean,
- object,
- array,
- collection,
- date, datetime, a timestamp
Příklad
Například atribut is_admin, jehož hodnotu ukládáme v databázi v podobě čísla typu integer (0 nebo 1) lze při získání z třídy modelu automaticky převést na datový typ boolean (true nebo false):
/** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ];
Změna výchozího nastavení
Změna názvu sloupce představující primární klíč:
protected $primaryKey = 'article_id';
Změna názvu sloupce pro uložení data vytvoření a aktualizace řádku v databázi.
const CREATED_AT = 'creation_date'; const UPDATED_AT = 'last_update';