Diskuze: nette - výjimka při mazání řádku z databáze s cizím klíčem

PHP Nette Framework Nette framework nette - výjimka při mazání řádku z databáze s cizím klíčem

Avatar
Dominika Šulcová(dominiQa):

ahoj, mám tabulku 'kategorie_au­t'(nákladáky, osobáky, motorky, autobusy) a pak tabulku 'auta' která má cizí klíč 'ID_kategorie_aut'. takhle mám akci na smazání kategorie:

public function actionRemoveKategorieAuta($id) {
        $kategorie = $this->context->kategorieModel->find($id);
        if(!$kategorie) {
            $this->error('neplatné id!');
        }
        try     {
            $this->context->kategorieModel->delete($id);
            $this->flashMessage("Kategorie aut byla smazána.");
        }
        catch (Exception $e) {
            $this->flashMessage("Tato kategorie nemůže být smazána.", 'errorFlash');
        }
        $this->redirect('kategorie');
    }

jenomže problém nastává pokud chci smazat například kategorii 'Autobusy' a v tabulce 'auta' mám vložen sloupec s cizím klíčem odkazující na 'Autobusy'. Zavolá se výjimka i když to mám v try-catch.
Nevíte proč se mi ta výjimka zavolá, když jí mám ošetřenou? díky

Odpovědět 17.4.2014 16:50
I ♥ nutella
Avatar
Nikola Sterziková (PaNika):

Ahoj,
tohle dělat nemůžeš. Od toho cizí kliče v relačních databázích jsou, aby mimo jiné zabránily smazání hodnoty, na kterou se odkazují jiné záznamy.
Můžeš udělat to, že do tabulky s číselníkem kategorií přídáš sloupec JeAktvni, který bude TRUE nebo FALSE a místo mazání, nastavíš hodnotu JeAktvni=FALSE. Při zadávání nových záznamů pak zobrazuješ jen ty aktivní kategorie, ale když někdo bude prohlížet starší záznam o autě, které bude zařazeno do již neaktivní kategorie, zobrazí se mu správně.
Nikola

 
Nahoru Odpovědět 17.4.2014 17:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.