Problém s fetch(), vrací pole výsledků
- nekark
- Člen | 16
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?
- Šaman
- Člen | 2668
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)
- Šaman
- Člen | 2668
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)