Vyfiltrování knížek podle tagů
- Richard Jedlička
- Člen | 51
Čau,
předpokládejme příklad databáze jako je zde https://doc.nette.org/cs/database.
Jak mam postavit dotaz, abych dostal jen knihy s určitými tagy?
Zkoušel jsem
$connection->table("book")->where("book_tag:tag.name", array("tag1", "tag2"));
To ale neodpovídá tomu co chci, to mi vrátí všechny knihy, který maj alespoň jeden ze zadaných tagů, já potřebuju jen ty co maj všechny zadané tagy
Zkusil jsem pak tohle
$connection->table("book")->where("book_tag:tag.name", "tag1")->where("book_tag:tag.name", "tag2");
To mi pro změnu nevrátilo vůbec nic.
Poraďte jak to mám udělat.
Dík Uiii
- Richard Jedlička
- Člen | 51
No ten dotaz bych postavil asi takhle (je to jinak než jsi myslel ty):
SELECT * FROM boook
JOIN book_tag ON book.id = book_tag.book_id
JOIN tag ON book_tag.tag_id = tag.id
WHERE tag.name = 'tag1' or tag.name = 'tag2'
GROUP BY book.id
HAVING COUNT(tag.id) = 2
Dá se tohle přepsat pomocí \Nette\Database?
- Richard Jedlička
- Člen | 51
Dobrý už to mám. Je to jednoduchý:
$tags = array("tag1", "tag2");
$connection->table("book")->where("book_tag:tag.name", $tags)->group("id", "COUNT(book_tag:tag.id) = " . count($tags));
EDIT: pozdě :D
Editoval uiii (9. 2. 2013 12:23)
- Richard Jedlička
- Člen | 51
enumag napsal(a):
Ten tvůj where tam strká AND místo OR, to nemůže fungovat, ne?
Nestrká tam AND, je to ekvivalent
book_tag:tag.name IN ("tag1", "tag2")
.
Editoval uiii (9. 2. 2013 12:33)
- Richard Jedlička
- Člen | 51
Ale jinak dík za nasměřování. On ten nápad s tím vytvořením si SQL dotazu a teprve pak uvažování o Nette\Database je vážně dobrý ;).