Jak na SQL dotaz z podmínkiu EXISTS

OdpadlikCZ
Člen | 15
+
0
-

Můžete mi, prosím, někdo poradit jak tento SQL dotaz přepsat do Database/Explorer.

SELECT si.*
FROM stock_items si
WHERE si.cat_id = 30
AND si.active = 1
AND EXISTS (
SELECT 1
FROM stock_items_types sit
WHERE si.id = sit.id_i
AND (sit.pocet > 0 OR sit.active = 1)
);

Pokud použiji

$q = $this->database
		  ->table($this->db_items)
		  ->alias($this->db_items,'si')
		  ->where('EXISTS (SELECT 1 FROM stock_items_types sit WHERE si.id = sit.id_i AND (sit.pocet > 0 OR sit.active = 1) )');

tak mi to vyhodí chybu

Nette\InvalidArgumentException
No reference found for $stock_items->sit.

V tabulce ‚stock_items_types‘ exstuje cizí klíč
Zdroj | Cíl |Při smazání | Při změně
id_i | stock_items(id) | RESTRICT | RESTRICT

Předem moc děkuji za rady.

Editoval OdpadlikCZ (9. 12. 10:04)

Kamil Valenta
Člen | 820
+
0
-

Ona opravdu ze stock_items neexistuje reference do stock_items_types.
Pro vazbu „has many“ bys musel použít „->related“:
https://doc.nette.org/…ase/explorer#…

Možná by ale vyšlo efektivněji (než EXISTS a subdotaz) udělat běžný LEFT JOIN ze stock_items_types do stock_items a pak GROUP BY si.id
Pro Explorer to bude přímočará konstrukce a výsledný dotaz (tipuji) bude rychlejší.

OdpadlikCZ
Člen | 15
+
0
-

Nejsem si jistý, jestli to bude fungovat i v případě, že primárně vybírám items z ‚stock_items‘ z dané categorie ‚cat_id‘ a přes ‚stock_items_types‘ jsem chtěl vybrat jen ty items co mají aspoň jeden nenulový typ v tbl ‚stock_items_types‘ podle sloupce ‚pocet‘.

Jestli jsem tě pochopil správně, tak bych to měl zkusit jít přes tabulku ‚stock_items_types‘,ale tam není vazba na kategorii.

OdpadlikCZ
Člen | 15
+
0
-

ještě by to šlo přes SQL dotaz

SELECT * FROM stock_items si
RIGHT JOIN stock_items_types sit ON si.id = sit.id_i
WHERE si.cat_id = 30
  AND si.active = 1
  AND sit.pocet > 0
  AND sit.active = 1;

ale nedaří semo převést do Database/Explorer

Kamil Valenta
Člen | 820
+
0
-
$q = $this->database
    ->table('stock_items_types')
    ->select('stock_items.id')
    ->where('stock_items_types.pocet > 0 OR stock_items_types.active = 1')
    ->where('stock_items.active = 1')
    ->where('stock_items.cat_id', 30)
    ->group('stock_items.id');
OdpadlikCZ
Člen | 15
+
0
-

Díky, vyzkouším.