Datagrid – setDataSource – způsoby získání dat pro grid
- woo
- Člen | 9
Ahoj. Mám dotaz ohledně nastavení dat z databáze. Cest bude asi hodně, ale potřeboval bych poradit od zkušenějších, jaký je rozdíl v nastavení dat pomocí setDataSource těmito způsoby:
obyč připojení na databázi:
$sql='SELECT * FROM table';
$grid->setDataSource($this->database->fetchAll($sql));
dibi připojení:
$grid->setDataSource($this->dibiConnection->select('*')->from('table'));
Díky
Editoval woo (27. 10. 2020 13:16)
- Šaman
- Člen | 2659
To první vrací přímo pole s výsledky (fetchAll
). Takže
klidně milion záznamů, i když v datagridu jich máš zobrazených 10.
To druhé předává připravenou query, kterou si datagrid doplní o řazení,
prefix a limit. A až pak si řekne o výsledky, jen ty které chce
zobrazit.
(Jen pro úplnost – není moc rozdíl mezi Dibi a Nette\Database co se možností týče. Rozdíl je v tom, že v prvním případě voláš fetch a ve druhém ne.)
Editoval Šaman (27. 10. 2020 12:45)
- woo
- Člen | 9
Šaman napsal(a):
To první vrací přímo pole s výsledky (
fetchAll
). Takže klidně milion záznamů, i když v datagridu jich máš zobrazených 10.
To druhé předává připravenou query, kterou si datagrid doplní o řazení, prefix a limit. A až pak si řekne o výsledky, jen ty které chce zobrazit.(Jen pro úplnost – není moc rozdíl mezi Dibi a Nette\Database co se možností týče. Rozdíl je v tom, že v prvním případě voláš fetch a ve druhém ne.)
Děkuji za vysvětlení. Jen pro objasnění mého dotazu. Měl jsem dříve
problém s daty ohledně datagridu a na data jsem se dotazoval pomocí prvního
případu fetchAll. To ale způsobilo nefunkční „bigEdit“ –mám nyní
odzkoušeno i na příkladu od pana Jandy– A pokud použiju fetchAll, stane
se mi při kliknutí na tlačítko edit „tužka“, že tlačítko pouze
zmizí a program zřejmě netuší, který řádek dle ID editovat (dle mého
názoru si nerozumí datové typy).
Pokud jsem ovšem nahradil fetchAll druhým použitím pro získání dat a to
DIBI .. problém zmizel.
Pan Janda v příkladu popisuje, že jej připravil protože ho lidi často
kontaktují s tím, že je datagrid nefunkční. Mohli by dělat stejnou chybu
jako já, kde se pak projeví dříve zmíněné. Snad jsem byl pochopen…
To je důvod, proč hledám rozdíl.
Editoval woo (27. 10. 2020 13:15)
- Šaman
- Člen | 2659
Asi to bude tím, že to první je prostě pole. Datagrid dokáže nějak pracovat s polem záznamů (zobrazit, seřadit, stránkovat), ale třeba v editaci je už problém. Pole už o žádné databázi nic neví.
Pro plné využití různých datagridů použij datasource s vazbou na databázi (což jsou asi všechny ostatní kromě ArrayDatasource). Takže v tom prvním případě předáš jen
$grid->setDataSource($this->database->table('table'));
viz https://contributte.org/…-source.html
Ještě k tomu ArrayDatasource – pokud to nutně nepotřebuješ (třeba opravdu pro zobrazení obyčejného pole v tabulce) tak ho nepoužívej. Veškeré řazení probíhá přes php funkce řazení polí, které je řádově pomalejší, než když to provedeš v databázi.
Editoval Šaman (27. 10. 2020 13:56)
- woo
- Člen | 9
Šaman napsal(a):
Asi to bude tím, že to první je prostě pole. Datagrid dokáže nějak pracovat s polem záznamů (zobrazit, seřadit, stránkovat), ale třeba v editaci je už problém. Pole už o žádné databázi nic neví.
Pro plné využití různých datagridů použij datasource s vazbou na databázi (což jsou asi všechny ostatní kromě ArrayDatasource). Takže v tom prvním případě předáš jen
$grid->setDataSource($this->database->table('table'));
Děkuji. Věřím, že nebudu jediný, komu podobné stalo. Tak snad to pomůže více lidem. Pěkný zbytek dne…