Skip to content

14 Ukladanie modelu do DB

Patrik Hrkút edited this page Nov 11, 2023 · 2 revisions

Ukladanie dát 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.

Pridanie nového modelu

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();

Ukladanie zmien v modeli

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 triede App\Core\Model.

Kontrola, či záznam v DB existuje

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.