Vyfiltrování knížek podle tagů

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

Č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

enumag
Člen | 2118
+
0
-

Doporučuji si nejdříve zkusit napsat klasický SQL dotaz pokud nevíš. V tomto případě je nutné použít EXISTS a závislý subSELECT na každý jednotlivý tag.

Richard Jedlička
Člen | 51
+
0
-

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?

castamir
Člen | 629
+
0
-

Použij na to query. Výsledek dostaneš jako Statement, nikoliv Selection, ale pro jednoduchou práci s daty to bohatě stačí. Iterovat nad výsledkem můžeš úplně stejně.

enumag
Člen | 2118
+
0
-

Jo, to je ta druhá možnost. :-)

Snad takhle.

$connection->table("book")->where("book_tag:tag.name = ? OR book_tag:tag.name = ?", $tag1, $tag2)->group('book.id')->having('COUNT(book_tag:tag.id) = ?', 2);
Richard Jedlička
Člen | 51
+
0
-

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)

enumag
Člen | 2118
+
0
-

Ten tvůj where tam strká AND místo OR, to nemůže fungovat, ne?

EDIT: A hele, zapomněl jsem, že Selection nemá metodu having. :-)

Editoval enumag (9. 2. 2013 12:30)

Richard Jedlička
Člen | 51
+
0
-

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)

enumag
Člen | 2118
+
0
-

Hmm nějak mi to dneska nemyslí. :-/ Samozřejmě máš pravdu. :-)

Richard Jedlička
Člen | 51
+
0
-

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ý ;).

vvoody
Člen | 910
+
0
-

enumag napsal(a):

Ten tvůj where tam strká AND místo OR, to nemůže fungovat, ne?

EDIT: A hele, zapomněl jsem, že Selection nemá metodu having. :-)

A druhý parameter group?

Richard Jedlička
Člen | 51
+
0
-

vvoody: Vždyť ten jsem taky použil. Metodu having ale Selection nemá.

enumag
Člen | 2118
+
0
-

@vvoody: Přesně o to mi šlo, ve svém kódu jsem napsal ->group()->having() což bylo špatně, zapomněl jsem že having se dává jako druhý parametr metodě group.

vvoody
Člen | 910
+
0
-

Nabudúce si radšej poriadne prečítam každý post ;)