Jak řešíte číslování řádků se stránkováním?
- maarlin
- Člen | 207
Nevím nakolik je tenhle problém dibi a nakolik Nette, postuji ho sem…
Využívám Paginator z addons a dibi.
Problém je následující:
Mám nějaký datový model:
<?php
class Users extends BaseModel {
public function getUsersList() {
return $this->connection->select('*')->from('users');
}
}
?>
Pokud chci rovnou nechat databázovou vrstvu očíslovat vrácené výsledky, musím do té metody přidat několik dalších parametrů a hlavně tím zcela přicházím o tu výhodu hrát si ještě dál se sestaveným dotazem v presenteru…
<?php
class Users extends BaseModel {
public function getUsersList($offset, $limit, $orderingCol, $orderingDir = 'DESC') {
$originalQuery = $this->connection->select('*')->from('users')->orderBy($orderingCol.' '.$orderingDir)->limit($limit)->offset($offset);
return $this->connection->select('SELECT @rownum:=@rownum+1 [position], x.*, (%sql) x', (string)$originalQuery)->from('users')->from('(SELECT @rownum:=%i) r', $offset);
}
}
?>
a pak to volat jako
<?php
$users = new Users;
$users->getUsersList($paginator->offset, $paginator->itemsPerPage, 'salary');
?>
Což mě prostě značně omezí a v případě že bych potřeboval v presenteru ještě nějak pozměnit podmínky výpisu, musím to opět přidat jako další parametr…
Jak to elegantně vyřešit? Dokáže dibi třeba nějak přistupovat k tomu subquery uvnitř?
Editoval maarlin (4. 4. 2011 13:07)
- maarlin
- Člen | 207
Michalek napsal(a):
$users->getUsersList()->limit($lim)->offset($off)
:)Jestli je to z pohledu „dnešního přístupu“ správně, netuším.
Asi jsem správně nepopsal ten problém… tohle ale připojí LIMIT klauzuli na konec toho dotazu – tzn. omezí už hotové, očíslované výsledky… já je potřebuji omezovat ještě před číslováním…
- Filip Procházka
- Moderator | 4668
A na co bys potřeboval číslovat řádky? Pokud chceš v nějakém přehledu záznamů pokračovat od určitého záznamu, tak od toho máš v paginátoru informaci na které si stránce a kolik záznamů máš na stránku.
{=($paginator->page-1)*$paginator->itemsPerPage + $iterator->counter}