-
Notifications
You must be signed in to change notification settings - Fork 22
14 Ukladanie modelu do DB
Hodnoty atribútov modelu, ktorý chcete do DB uložiť, je možné získať napr. z HTML formulára. Hodnoty odoslané z formulára sú dostupné pomocou inštancie triedy
Request
dostupnej v kontroléri a jej metódy getValue()
(je to rovnaká metóda, ako sa používa pri čítaní URL GET parametrov). Metóda nerozlišuje, či boli
hodnoty z formulára poslané metódou GET, alebo POST.
Model je potrebné najskôr vytvoriť a potom do jeho atribútov priradiť hodnoty napr. z formulára. Keď máme vytvorený model a hodnoty jeho atribútov sú
naplnené, je možné model uložiť do DB. Na to slúži metóda save()
. Metóda použije SQL príkaz INSERT
. Celý postup je uvedený na nasledovnom príklade
(úryvok z metódy kontroléra PostController
):
$post = new Post();
$post->setText($this->request()->getValue('text'));
$post->save();
Ak potrebujete zmeniť hodnoty modelu v DB tabuľke, musíte použiť mierne odlišný postup. Model, ktorý chcete zmeniť, najskôr načítate z DB, aby ste naplnili jeho
atribúty hodnotami z DB. Potom zmeníte atribúty, ktoré potrebujete a celý model uložíte rovnakou metódou save()
ako pri vkladaní nového modelu. Teraz však
metóda použije SQL príkaz UPDATE
. Tu je ukážka kódu:
$id = (int)$this->request()->getValue('id'); // pre istotu pretypujte vstup od používateľa na int
$post = Post::getOne($id);
$post->setText($this->request()->getValue('text'));
$post->save();
Poznámka: Ako framework vie, či má ukladať nový záznam, alebo zmeniť existujúci, keď volá rovnakú metódu
save()
? Na tento účel používa privátny atribút$_dbId
v triedeApp\Core\Model
.
Keďže parameter id
prichádza od používateľa, ktorý s ním môže manipulovať, aplikácia by sa mala vysporiadať so situáciou, že záznam, ktorý sa používateľ
pokúša zmeniť, neexistuje. Na korektnú detekciu stačí zistiť, či metóda getOne()
vrátila inštanciu modelu, alebo hodnotu null
. Obsluha chyby je potom
jednoduchá:
if (is_null($post)) {
throw new HTTPException(404); // Not found
}
Viac o spôsobe ošetrovania chýb vo frameworku sa dozviete v článku Ošetrovanie chýb.