Počet řádků v databázi podmíněné hodnotou z jiné tabulky

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

Je tu nějaká dobrá alternativa pro tento zápis ve fluent stylu? Nemám/nepoužívám FK. Chci pouze získat seznam eventů (událostí), které mají u jeho podniku (point) typ (type) 2

$this->db->query("
	SELECT COUNT(*) cnt
	FROM events e
	INNER JOIN points p ON p.type = ?
	AND p.id = e.point_id
", 2);

Editoval genesiscz (18. 3. 2014 23:08)

genesiscz
Člen | 21
+
0
-

Nikdo nic? :-O

JDC
Člen | 19
+
0
-

Zkus

$db->table("events")->select("COUNT(*)")->where("points.type", $type);

ale nejsem si jist, jestli to mám dobře. Střílím to z hlavy, ale mělo by to jít. Joiny v Nette by se měly automaticky utvořit přes where (či možná ještě select) s tím že dáš cizi_tabulka.sloupec. Příslušný sloupec by měl mít cizí klíč.

genesiscz
Člen | 21
+
0
-

Psal jsem, že nemám FK (cizí klíče), protože jedu na MyISAM, ne InnoDB. Jiný způsob není? :(

Mysteria
Člen | 797
+
0
-

Cizí klíče nejsou potřeba, stačí mít konvenčně pojmenované sloupečky, sám používám na MyISAM.

genesiscz
Člen | 21
+
0
-

To bohužel taky nemám, mám to v plurálu a odkazy na to jako sigulár. (tabulka points ale odkaz v jiné tabulce jako point_id). Co teď?

Mysteria
Člen | 797
+
0
-

Máš dvě možnosti, buď to takhle nechat a v tom případě budeš muset psát normálně SQLko nebo to předělat podle konvencí (taky jsem přesně z tohohle důvodu u prvního projektu v půlce programování musel předělávat DB). Osobně bych doporučil druhou možnost, pokud to nemáš extra velkej projekt, tak to stejně víc jak půl hodinky nezabere a opravdu se to vyplatí.

Ono i když to nebudeš mít podle konvencí, tak třeba místo $table->secondTable->column jde psát $table->ref(secondTable, column)->column, ale komu by se tohle chtělo psát, když stačí dodržovat konvence…

Editoval Mysteria (21. 3. 2014 22:16)

genesiscz
Člen | 21
+
0
-

A sakra, já ref používám celkem často. :-D

Jen je problém, že v tomhle případě ani tenhle zápis, pokud vím, nepomůže, protože nevybírám žádné řádky ale agregační funkci s podmínkou z jiné tabulky.

Michal Vyšinský
Člen | 608
+
0
-

Nejlepší a nejmíň náročné řešení bude napsat si vlastní Reflection class, kde definuješ svoji konvenci. Inspirovat se můžeš třídou ConventionalReflection

Musíš pouze implementovat rozhraní IReflection

Editoval Michal Vyšinský (21. 3. 2014 23:43)