Spojení více tabulek zápis v nette

před 10 měsíci

iru
Člen | 79
+
0
-

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?

před 10 měsíci

Phalanx
Člen | 299
+
0
-

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

před 10 měsíci

iru
Člen | 79
+
0
-

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)

před 10 měsíci

iru
Člen | 79
+
0
-

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)

před 10 měsíci

Phalanx
Člen | 299
+
0
-
<?php
if($this->findpol4)
            $dataTable ->where('EXISTS(SELECT id FROM seznam_zanr WHERE seznam_id=seznam.id AND zanr_id=?)', $this->findpol4);
?>

Editoval Phalanx (2. 5. 2019 10:38)

před 10 měsíci

iru
Člen | 79
+
0
-

Phalanx napsal(a):

<?php
if($this->findpol4)
            $dataTable ->where('EXISTS(SELECT id FROM seznam_zanr WHERE seznam_id=seznam.id AND zanr_id=?)', $this->findpol4);
?>

jak jednoduché… tisíceré díky :-)