Oznámení
Smazání řádku z result
před 11 lety
- Jakub Šulák
- Člen | 223
Zdravím,
mám takový problém:
Mám nějakou Nette komponentu (datagrid), kde je možnost vyhledávat ve
sloupcích.
Jelikož vyhledávání je na něco ještě napojeno, nejde dělat přímo na DB
serveru.
Provede se tedy:
<?php
$result = dibi::query($sql);
$result = vyhledavani($result);
$template->rows = $result->fetchAll(0,10);
?>
Problém je u funkce vyhledavani();
Ta vypadá:
<?php
while ($row = $result->fetch())
{
if (ereg('vyhledani')===false){
unset($row); // toto je potreba nahradit uplnym vymazanim radku z vysledku
}
}
?>
Problém je, jak z toho $result dostat pryč určitý řádek. Jediné co napadlo mně, je udělat fetchAll() a pak to procházet a vyhazovat prvky pole. Rychlostně je celkem v pohodě, ale pokud uděláte fetchAll() na řádově stovkách tisíc záznamů dojde samozřejmě paměť vlákna. Proto se to musí dělat sekvenčně přes fetch().
Otázka: Jde vůbec z toho $result nějak vyhodit záznam, případně jak?
před 11 lety
- Jakub Šulák
- Člen | 223
Ta třída je dobrá, ale v tomto nepomůže. Potřebuje totiž, abych jí
předal Iterator. Což je v dibi $result->getIterator().
Tato funkce je ale definovaná:
<?php
final public function getIterator($offset = NULL, $limit = NULL)
{
return new ArrayIterator($this->fetchAll($offset, $limit));
}
?>
Takže je to stejné, jako bych volal $this->fetchAll() sám.
Jediné co mne ještě napadá, je zpracovávat to po částech – načítat
fetchAll(0,100).. (100,100)… a dělat si nějaký výstup… ale ještě to
musím promyslet. Dobré řešení to ale také nebude.
před 11 lety
- David Grudl
- Nette Core | 6806
To máš pravdu… Takže ještě je potřeba dopsat iterator pro DibiResult. On tam kdysi byl, snad by mohl jít stále použít. A rovnou do něj můžeš přidat to filtrování. (dal jsem to pryč, protože pak nejde dělat vnořené cykly).
před 11 lety
- David Grudl
- Nette Core | 6806
Ale jestli jsi byl celý rok moc hodný, tak bych tam ten DibiResultIterator vrátil.
před 11 lety
- Jakub Šulák
- Člen | 223
Bylo by to nejlepší – vůbec pro tyhle věci, aby se člověk vyhnul memory_limitu při tvorbě db-based komponent.
před 11 lety
- David Grudl
- Nette Core | 6806
Nezamlouvej to – byl jsi celý rok moc hodný?
před 11 lety
- phx
- Člen | 652
LOL
Urcite byl… uz jen svatozar mu chybi:)
před 11 lety
- Jakub Šulák
- Člen | 223
:-) myslím, že určitě – tak jako my všichni…
před 11 lety
- David Grudl
- Nette Core | 6806
ok, DibiResultIterator is back!
Můžeš udělat filtrujícího potomka nebo kompozici s tim FilterIterator
před 11 lety
- Jakub Šulák
- Člen | 223
Super, díky