Problém s fetch(), vrací pole výsledků

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

Ahoj,

řešil jsem problém s funkcí fetch();
Když mám kód takto:

$select = $this->database->table('table);

$select->where('column', 'neco')->fetch();

Stane se to, že po fetch() mám výsledek, ač je jeden, v poli, tudíž nemohu udělat $select[‚column‘], ale musím dělat $select[1][‚column‘]

Když se to provede, ale následujícím způsobem

$select = $this->database->table('table)->where('column', 'neco')->fetch();

vše funguje. Říkal jsem si, že to bude tím, že v první možnosti mám vlastně vybrané všechny výsledky, které pak omezím na jeden, a tudíž to stejně vychodí pole výsledků s jedním místo jednoho výsledku.

Nezná někdo řešení na rozchození prvního příkladu, kdy nejdříve vyberu tabulku a až později fetchuji?

CZechBoY
Člen | 3608
+
0
-

Mělo by to fungovat. Fetch by měl rozhodně vrátit jen jeden řádek a ne všechny.
Nemáš tam třeba fetchAll()?

Editoval CZechBoY (8. 1. 2016 21:48)

Šaman
Člen | 2668
+
+2
-

chápu to tak, že dáš

$select = $this->database->table('table');
$select->where('column', 'neco')->fetch();
dump($select); # a tady je stále pole, resp. Nette\Database\ResultSet

To je logické, $select je pole výsledků (resp. array object Nette\Database\ResultSet), ale ukazatel je nastavený na aktuální prvek. Ten fetch jen změnil stav objektu a vrátil ti Row. Projdi si to foreachem, nebo si do výsledku přiřaď výsledek té funkce, tedy

$select = $this->database->table('table');
$row = $select->where('column', 'neco')->fetch();
dump($row); # tady už máš Nette\Database\IRow, nebo FALSE
# a kromě toho se posunul iterator objektu $select na novou pozici

Editoval Šaman (8. 1. 2016 23:45)

nekark
Člen | 16
+
0
-

Děkuji za odpovědi a především Šamanovi :)

Šaman
Člen | 2668
+
0
-

Nz. Jen když to vidím s odstupem času, upravil bych ten kód takhle (aby jméno proměnné select dávalo smysl). A taky při použití table() nedostaneš ResultSet, jak jsem psal výše, ale Nette\Database\Table\Selection (to jen pro upřesnění, pro tebe se nic nemění).

# vytvoříme objekt Nette\Database\Table\Selection
$select = $this->database->table('table')->where('column', 'neco');

# z něho získáme jednotlivé řádky Nette\Database\IRow
$row1 = $select->fetch();
$row2 = $select->fetch();

# když už nejsou další výsledky, vrátí se FALSE
$rowX = $select->fetch();


# --------------
# většinou se ale používá foreach, který projde výsledky nízkoúrovňově pomocí iterátoru
foreach ($select as $row) {
	dump($row);
}

Editoval Šaman (9. 1. 2016 15:18)