tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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

David Grudl
Nette Core | 6806

Zkus se podívat na FilterIterator.

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