tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

DibiFluent, LIMIT, OFFSET a fetch()

před 8 lety

kopec
Člen | 3

Ahoj, potřebuji získat jeden konkrétní řádek v pořadí, ale vrací mi to chybu kvůli nesprávnému pořadí LIMIT a OFFSET:

<?php
$query->limit(1)->offset($offset)->fetch();
//...LIMIT 1 OFFSET [cislo] LIMIT 1

$query->offset($offset)->fetch();
//...OFFSET [cislo] LIMIT 1
?>

Napadá mě

<?php
$query->limit(1)->offset($offset)->fetchAll();
return $query[0];
?>

ale to není moc elegantní.

S tím možná souvisí i další věc, a to sice, že se LIMIT nepřepisuje, ale přidává

<?php
$query->limit(1)->limit(2);
?>

vrací celkem nelogicky …LIMIT 1 LIMIT 2 místo očekávaného …LIMIT 2.

Editoval kopec (18. 12. 2011 14:03)

před 8 lety

Milo
Nette Core | 1119

kopec napsal(a):

Ahoj, potřebuji získat jeden konkrétní řádek v pořadí, ale vrací mi to chybu kvůli nesprávnému pořadí LIMIT a OFFSET:

<?php
$query->limit(1)->offset($offset)->fetch();
//...LIMIT 1 OFFSET [cislo] LIMIT 1

$query->offset($offset)->fetch();
//...OFFSET [cislo] LIMIT 1
?>

Jakou verzi používáš? Mně se pořadí vždy nastaví správne LIMIT x OFFSET y. Ve verzi 1.5rc i 1.2.

Napadá mě

<?php
$query->limit(1)->offset($offset)->fetchAll();
return $query[0];
?>

ale to není moc elegantní.

To je bug. Asi ho ani nelze obejít bez editace zdrojáků. Můžeš si DibiFluent::fetch() upravit takto:

public function fetch()
{
    if ($this->command === 'SELECT') {
        $fluent = clone $this;
        return $this->connection->query($fluent->limit(1)->_export())->fetch();
    } else {
        return $this->connection->query($this->_export())->fetch();
    }
}

S tím možná souvisí i další věc, a to sice, že se LIMIT nepřepisuje, ale přidává

<?php
$query->limit(1)->limit(2);
?>

vrací celkem nelogicky …LIMIT 1 LIMIT 2 místo očekávaného …LIMIT 2.

Opět… jakou verzi máš? Mě funguje přepisování.

před 8 lety

kopec
Člen | 3

Aye, moje chyba, koukal jsem na verzi a nějak mi nedošlo, že 1.5-rc1 není to samé, jako 1.5-rc, takže teď jsem updatoval a první problém je samozřejmě pryč.

//vyskytl se tedy nový ve formě fatálu, že třída DibiNettePanel neexistuje, ale to stačilo kdesi v DibiConnection tuto třídu načíst).

Druhý problém se vyřešil prvním, protože teď právě můžu udělat tu úpravu zdrojáku, kterou jsem předtím nemohl (limit se nepřepisoval).

Díky moc!

Editoval kopec (10. 1. 2012 10:54)