Špatný dotaz při COUNT() v NDBT

Polki
Člen | 553
+
0
-

Čauec. Mám jenom dotaz. Proč toto:

$this->db->table('test')->count();

vygeneruje toto:

SELECT 'id' FROM 'test'

a pak se ten count vykoná jako spočítání počtu záznamů, co vrátila DB pomocí foreach, místo aby to udělalo tento dotaz:

SELECT COUNT('id') FROM 'test'

???

Polki
Člen | 553
+
0
-

PS: vím, že metoda ‚->count()‘ má parametr jako sloupeček. Zajímalo mě jen, že když se nezadá žádný, proč to nevygeneruje automaticky přes ID?

Kamil Valenta
Člen | 752
+
0
-

Každá tabulka nutně nemusí ID obsahovat. Ale je pravda, že by se ten count() mohl vygenerovat podle prvního sloupce tabulky, ve většině případů to ID bude…

Polki
Člen | 553
+
0
-

kamil_v napsal(a):

Každá tabulka nutně nemusí ID obsahovat. Ale je pravda, že by se ten count() mohl vygenerovat podle prvního sloupce tabulky, ve většině případů to ID bude…

To chápu, že ne každá má sloupec id, ale při prvním průchodu si stejně Nette zjišťuje, jaké sloupečky tam jsou a případně vrací pouze PrimaryKey. Tu většina tabulek má. Pokud ne, tak by se mohl jak píšeš dotázat na první sloupec, nebo prostě udělat jen

SELECT COUNT(*) FROM `test`

to by mělo stejný efekt a není potřeba zjišťovat jaký sloupec se tam má dosadit a hlavně v případě, že zapomene programátor sloupec doplnit, tak se nemusí divit, že na 20 tisících řádcích mu trvá dotaz na počet řádků nějak dlouho a půl dne hledat, kde udělal chybu.

David Matějka
Moderator | 6445
+
0
-

je mozna trochu nestastne, ze to nejsou spise dve metody. ale to, jak se to chova bez parametru je zamerne – kdyz chces zjistit, jestli ti dotaz vratil nejake zaznamy. selection dokonce implementuje Countable interface, takze muzes pouzit treba if(count($rows)) {...}

Polki
Člen | 553
+
0
-

@DavidMatějka To vím. běžně dávám selection do foreache apod. Ale když zavolám count() tak spíš, než selection s řádky, nebo něco podobného očekávám pouze číslo. A v tomto případě moc nerozumím tomu, proč bych měl zkoušet count($rows), když vím, že jsem do $rows uložil $selection->count();, což by mělo vrátit číslo.