No reference found for $dokumenty_soubory->dokumenty_kategorie

Allconius
Člen | 317
+
0
-

Ahoj, mám 2 tabulky:

[dokumenty_kategorie]
*id_kategorie
*poradi
*nazev
*smazano

[dokumenty_soubory]
*id
*id_oblast (cizí klíč do oblast.id_oblast)
*id_kategorie (cizí klíč do dokumenty_kategorie.id_kategorie)
*poradi
*odkaz
*smazano

pokud ale chci setřídit dokumenty podle položky poradi v tabulce dokumenty_kategorie :

$this->tabulka9 = 'dokumenty_kategorie';
$this->tabulka10 = 'dokumenty_soubory';

    public function zobrazDokumenty1($oblast)
    {
        $result = $this->database->table($this->tabulka10)
            ->where(''.$this->tabulka10.'.smazano = ?', 0)
            ->where(''.$this->tabulka10.'.id_oblast = ?', $oblast)
            ->order(''.$this->tabulka10.'.id_oblast ASC, '.$this->tabulka9.'.poradi DESC, '.$this->tabulka10.'.odkaz ASC');

        return $result;
    }

tak mi to vyhodí:

Nette\InvalidArgumentException
No reference found for $dokumenty_soubory->dokumenty_kategorie.

Co tam mám špatně ?

Polki
Člen | 553
+
0
-

Nezkoušel jsem, ale napadají mě 2 věci.

  1. máš vše jako InnoDB?
  2. Zkus jako obsah proměnné $this->tabulka9 nastavit jen kategorie
stepos2
Člen | 53
+
+1
-

Je potřeba dodržovat určité konvence. Takže název sloupce by měl být dokumenty_kategorie_id

Allconius
Člen | 317
+
0
-

Polki napsal(a):

Nezkoušel jsem, ale napadají mě 2 věci.

  1. máš vše jako InnoDB?
  2. Zkus jako obsah proměnné $this->tabulka9 nastavit jen kategorie

Ahoj s tím kategorie to funguje , mám tam špatně ten název sloupce jak psal stepos2, díky

Allconius
Člen | 317
+
0
-

stepos2 napsal(a):

Je potřeba dodržovat určité konvence. Takže název sloupce by měl být dokumenty_kategorie_id

Ahoj, díky, takže struktura tabulek má být správně takto? :

[dokumenty_kategorie]
*id_kategorie
*poradi
*nazev
*smazano

[dokumenty_soubory]
*id
*oblast_id (cizí klíč do oblast.id_oblast)
*dokumenty_kategorie_id (cizí klíč do dokumenty_kategorie.id_kategorie)
*poradi
*odkaz
*smazano
Ages
Člen | 128
+
0
-

Ještě je vhodné dodržovat nějaký systém v pojmenování. U jedné tabulky máš primární klíč id a u druhé id_kategorie – děláš si s tím zbytečné problémy protože jak ti bude růst počet tabulek tak budeš muset hledat jak se v dané tabulce klíč jmenuje. Nehledě na to, že pokud bys chtěl použít nějaké ORM tak bude konfigurace náročnější.

Editoval Ages (30. 7. 2021 12:28)

Allconius
Člen | 317
+
0
-

Ages napsal(a):

Ještě je vhodné dodržovat nějaký systém v pojmenování u jedné tabulky máš primární klíč id a u druhé id_kategorie – děláš si s tím zbytečné problémy protože jak ti bude růst počet tabulek tak se budeš muset hledat jak se v dané tabulce klíč jmenuje. Nehledě na to že pokud bys chtěl použít nějaké ORM tak bude konfigurace náročnější.

Aha, díky, takže jestli jsem to správně pochopil tak prostě jen stačí mít v každé tabulce primární klíč s názvem id a sloupec pro cizí klíč ve tvaru [nazevtabulky]_id ?

Ages
Člen | 128
+
0
-

Ten primární klíč můžeš mít jakýkoliv, jen se ti v tom bude lépe orientovat pokud si budeš dodžovat nějaké konvence :-)
Co se týče pojmenování sloupců pro cizí klíče, tak v případě jedné vazby je to zase nejpřehlednější, když máš těch vazeb více tak už musíš volit název dle toho co tam chceš mít například pokud bys měl tabulku knih tak author_id, translator_id…

Jinak v tvém případě bych to osobně udělal nějak takto:

[dokumenty_kategorie]
*id
*poradi
*nazev
*smazano

[dokumenty_soubory]
*id
*oblast_id
*kategorie_id
*poradi
*odkaz
*smazano

$books = $explorer->table('dokumenty_soubory');
	->where('smazano = ?', 0)
	->where('oblast.id= ?', $oblast)
	...

Doporučuji ti ale pročíst dokumentaci „:https://doc.nette.org/…ase/explorer“ jak ti radil @stepos2

Ještě bych se chtěl zeptat proč si ukládáš ty názvy tabulek například jako tabulka10 – dle mého pohledu zase zbytečně ztrácíš informaci o tom co je to za tabulku. Nebylo by vhodnější to zvolit třeba jako dokKat, dokSou…? nebo místo atributu využít konstanty DOK_KAT, DOK_SOU?

Editoval Ages (30. 7. 2021 12:29)