změna dibi na Nette\Database

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

Když se v dibi u function použilo

<?php
return dibi::select("count(id)")->from('prispevky')->fetchSingle();
?>

Jak tohle přepíšu v nette database, když mi to vrací objekty a není možné dát ->fetchSingle();?

rixi
Člen | 109
+
0
-

prepis do Nette\Database by vyzeral asi takto

return $this->database->table('prispevky')->select('count(id)')->fetch();

ale v tomto pripade je mozne pouzit count metodu

return $this->database->table('prispevky')->count('id');
mulisano
Člen | 8
+
0
-

Při použití prvního přepisu:
Object of class Nette\Database\Table\ActiveRow could not be converted to int

O to mi šlo – jak donutit, aby to vracelo int a ne objekty.

nanuqcz
Člen | 822
+
0
-

fetchSingle() vrací jen jeden záznam (ne celý řádek), takže přepis by myslím měl být nějak takhle (aby vrátil přímo počet záznamů)

return $this->database->table('prispevky')->select('count(id) as count')->fetch()->count;

Ale s Nette\Database nedělám, tak mě kdyžtak opravte.

Každopádně způsob s ->count('id') bude ale asi čistší.

mulisano
Člen | 8
+
0
-

xxxObiWan:
tohle hodí sql syntax error. Způsob s ->count(‚id‘) je v tomto případě lepší, ale chtěl bych se dozvědět, jak by to šlo tím druhým způsobem (pro jiný selecty se mi to bude hodit).

nanuqcz
Člen | 822
+
0
-

Podle dokumentace by tomu nemělo klíčové slovo as vadit. Možná vadí, že je pojmenované count (zkus třeba ->select('count(id) as prispevkyCount')).

A když nepomůže, hoď sem jaký dotaz to vygenerovalo, a jakou chybu to píše ;-)

mulisano
Člen | 8
+
0
-

Dotaz:

<?php
SELECT count(id) `as` `pocet`
FROM `prispevky`
?>

Chyba: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

Editoval mulisano (19. 1. 2012 23:11)

nanuqcz
Člen | 822
+
0
-

To vypadá na bug v Nette\Database.

mulisano
Člen | 8
+
0
-

Tak to mám celkem pech, takhle jednoduchej příklad a hned bug…

nanuqcz
Člen | 822
+
0
-

Chyba bude IMHO někde tady, ale ten regulár je na mě moc složitý :-D

Počkej si pár dní, určitě to bude brzo opravené.

EDIT: Nahlásil jsem to jako bug.

Editoval xxxObiWan (19. 1. 2012 23:33)

Twista
Člen | 48
+
0
-

me normalne funguje

v modelu

public function getItems() {

	return $this->database->table('tabulka');
    }

a v presenteru

$this->template->pocetItemu = $this->model->getItems()->count();
rixi
Člen | 109
+
0
-

xxxObiWan wrote:

return $this->database->table('prispevky')->select('count(id) as count')->fetch()->count;

tak som si to vyskusal. pokial AS napiseme velkymi pismenami, tak to funguje bez problemov.
moznostou je aj pouzivat aj takyto krkolomny pristup bez aliasu

return $this->database->table('prispevky')->select('count(id)')->fetch->{"count(id)"};
hrach
Člen | 1834
+
0
-

co toto?

return $this->database->table('prispevky')->count('id');
rixi
Člen | 109
+
0
-

to funguje :))

mulisano
Člen | 8
+
0
-

HosipLan napsal(a):

Třeba pomůže http://sql-cross-queries.freexit.eu/dibi/nettedb/

Tak toto pomůže nejvíc, přesně to jsem se teď snažil prozkoumávat… :-)