Where podmínka přes více joinů na stejnou tabulku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
2bfree
Člen | 248
+
0
-

Mám v databázi dvě tabulky s vazbou M:N (Články a Tagy) a já bych potřeboval vytáhnout z databáze všechny články, které mají X tagů zároveň.

Tedy něco jako

/---sql
SELECT a.* FROM articles a
INNER JOIN tags AS tag1 ON tag1.article_id = c.article_id AND tag1.name = ‚prvni tag‘
INNER JOIN tags AS tag2 ON tag2.article_id = c.article_id AND tag2.name = ‚druhy tag‘
\--

Jak něco podobného zapsat v Nette Database?

Eda
Backer | 220
+
0
-

Přes jeden tag můžeš vyhledávat pomocí WHERE (něco jako :tags.name = 'prvni tag'), přes druhý budeš asi muset použít EXISTS a do něho napsat ten JOIN, pokud se nepletu.

2bfree
Člen | 248
+
0
-

To zní hezky, jen se zeptam, kterak tam ten exists natlačit, jelikož podle všeho metoda exists na Selection neni. ;(

Eda
Backer | 220
+
+1
-

No přímo do WHERE.

$selection->where('EXISTS(...)');

Ale pozor, názvy tabulek a sloupců bys měl escapovat tímto znakem: ` (teda já to tak dělám, používám ale MySQL, nevím, jak je tomu u ostatních driverů, zda to funguje stejně) jinak je NDB bude chtít navázat na vlastní JOINy…