Spojení více tabulek zápis v nette
- iru
- Člen | 110
Mám dotaz:
$dataTable = $this->database->query('SELECT seznam_zanr.seznam_id, seznam_zanr.zanr_id, seznam_kat.name AS kategorie, seznam.id, seznam.name, seznam.interpret, seznam.ord FROM seznam_zanr INNER JOIN seznam ON seznam_zanr.seznam_id = seznam.id INNER JOIN seznam_kat ON seznam.seznam_kat_id = seznam_kat.id WHERE seznam_zanr.zanr_id = '.$this->findpol4.' ORDER BY seznam.e ASC');
a nedaří se mi ho převést na zápis pro nette
$dataTable = $this->database->table('seznam_zanr')
->select('seznam_zanr.seznam_id AS seznam_id')
->select('seznam_zanr.zanr_id AS zanr_id')
->select('seznam.*')
->where('seznam.seznam_kat_id','seznam_kat.id')
->select('seznam_kat.name AS kategorie')
->where('seznam_zanr.zanr_id', $selection)
->order('seznam.name ASC');
Hlásí mi to chybu: No reference found for $seznam_zanr->seznam_kat
Prosím, jak správně spojit tyto tabulky a upravit dotaz?
- Phalanx
- Člen | 310
Zkus jestli vezme zápis:
<?php
$dataTable = $this->database->table('seznam_zanr')
->select('
seznam_zanr.*,
seznam.*,
seznam_zanr.seznam_id AS seznam_id,
seznam_zanr.zanr_id AS zanr_id,
seznam.seznam_kat.name AS kategorie
')
->where('seznam.seznam_kat_id=seznam_kat.id AND seznam_zanr.zanr_id=?', $selection)
->order('seznam.name ASC');
?>
Přičemž musíš mít správně cizí klíče (foreign keys).
Nejsem si úplně jistý zápisem
seznam.seznam_kat.name AS kategorie
– ten by šel případně
nahradit subselectem
(SELECT name FROM seznam_kat WHERE id=seznam.kategorie_id) AS kategorie
- iru
- Člen | 110
Phalanx napsal(a):
Zkus jestli vezme zápis:
<?php $dataTable = $this->database->table('seznam_zanr') ->select(' seznam_zanr.*, seznam.*, seznam_zanr.seznam_id AS seznam_id, seznam_zanr.zanr_id AS zanr_id, seznam.seznam_kat.name AS kategorie ') ->where('seznam.seznam_kat_id=seznam_kat.id AND seznam_zanr.zanr_id=?', $selection) ->order('seznam.name ASC'); ?>
Přičemž musíš mít správně cizí klíče (foreign keys).
Nejsem si úplně jistý zápisem
seznam.seznam_kat.name AS kategorie
– ten by šel případně nahradit subselectem
(SELECT name FROM seznam_kat WHERE id=seznam.kategorie_id) AS kategorie
Díky moc, ale i toto mi píše: No reference found for
$seznam_zanr->seznam_kat.
Ten zápis seznam.seznam_kat.name AS kategorie
projde, ten jsem už
vyzkoušela v jednodušším dotazu.
Cizí klíče mám taky nastavené.
Tabulka „seznam“ má cizí klíč na „seznam_kat“, kde
„seznam.seznam_kat_id=seznam_kat.id“
Tabulka „seznam_zanr“ má 2 cizí klíče na tabulku „seznam“ a tabulku
„zanr“, kde „seznam_zanr.seznam_id = seznam_id“ a „seznam_zanr.zanr_id
= zanr.id“
Problém asi bude v tom, že tabulka „seznam_zanr“ a tabulka
„seznam_kat“ spolu nesouvisí a nemají mezi sebou cizí klíče.
Ale když tento dotaz napíšu přímo do SQL do tabáze, tak mi to v pořádku vybere to, co chci:
'SELECT seznam_zanr.seznam_id, seznam_zanr.zanr_id, seznam_kat.name AS kategorie, seznam.id, seznam.name, seznam.interpret, seznam.ord FROM seznam_zanr INNER JOIN seznam ON seznam_zanr.seznam_id = seznam.id INNER JOIN seznam_kat ON seznam.seznam_kat_id = seznam_kat.id WHERE seznam_zanr.zanr_id = 1 ORDER BY seznam.name ASC'
jenže to potřebuji v nette zápisu, protože za určitých podmínek ten dotaz ještě upřesňuji:
if($this->findpol1)
$dataTable ->where ('seznam.name LIKE ?', '%'.$this->findpol1.'%' );
if($this->findpol3)
$dataTable ->where ('seznam_kat.id', $this->findpol3 );
if($this->findpol2)
$dataTable ->where ('seznam.interpret LIKE ?', '%'.$this->findpol2.'%' );
Ještě upřesním, jedná se o vyhledávání písniček podle kritérií, přičemž v tabulce „seznam“ je seznam všech písniček, v tabulce „seznam_kat“ mám kategorie písniček, v tabulce „zanr“ mám seznam žánrů a protože jedna písnička může mít víc žánrů, tak mám tabulku „seznam_zanr“, kde mám uloženou vazbu na písničky a jejich žánry. A vyhledává se podle názvu písničky, interpreta, kategorie a žánru…
Editoval iru (2. 5. 2019 10:24)
- iru
- Člen | 110
Toto je primární dotaz, který je ještě funkční, kde vypisuji všechny písničky a v případě vyhledávání se dotaz upřesní:
$dataTable = $this->database->table('seznam')
->select('seznam.*')
->select('seznam_kat.name AS kategorie')
->order('seznam.name ASC');
if($this->findpol1)
$dataTable ->where ('seznam.name LIKE ?', '%'.$this->findpol1.'%' );
if($this->findpol3)
$dataTable ->where ('seznam_kat.id', $this->findpol3 );
if($this->findpol2)
$dataTable ->where ('seznam.interpret LIKE ?', '%'.$this->findpol2.'%' );
Jenže tady chybí to vyhledávání podle žánrů, které k tomu potřebuji přidat…
if($this->findpol4)
... potřebuji zachovat všechny předchozí podmínky a omezit výsledek ještě na zvolený žánr
Editoval iru (2. 5. 2019 10:34)