No reference found for $dokumenty_soubory->dokumenty_kategorie
- Allconius
- Člen | 317
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ě ?
- stepos2
- Člen | 53
Je potřeba dodržovat určité konvence. Takže název sloupce by měl být dokumenty_kategorie_id
- Allconius
- Člen | 317
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
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
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
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)