Open achtan opened 10 years ago
Jak to vypadá prosím s podporou limit / offset? Dost by mi to pomohlo, nenapadá mne, jak bez limitu řešit stránkování.
no zatial asi len tak ze si limit spravis v php, ale zamozrejme to nieje spravne riesenie
Přidal jsem si do DomainQuery.php dvě metody:
public function limit($limit)
{
$this->cleanCache();
$this->clauses->limit = $limit;
return $this;
}
public function offset($offset)
{
$this->cleanCache();
$this->clauses->offset = $offset;
return $this;
}
A upravil metodu
public function getEntities()
{
if ($this->entities === NULL) {
$entities = array();
$entityClass = $this->clauses->from['entityClass'];
$result = $this->getResult($this->clauses->from['alias']);
$i = 0;
$limitIterator = 0;
foreach ($result as $key => $row) {
if(($i >= $this->clauses->offset and $limitIterator < $this->clauses->limit) or $this->clauses->limit == 0){
$entities[] = $entity = $this->entityFactory->createEntity($entityClass, new Row($result, $key));
$entity->makeAlive($this->entityFactory, $this->connection, $this->mapper);
$limitIterator++;
}
$i++;
}
$this->entities = $this->entityFactory->createCollection($entities);
}
return $this->entities;
}
Takže limit a offset používat můžu, ale je to podle mého hodně dirty řešení.
Ahoj,
důvod, proč jsem se k implementaci nakonec nedostal je, že u projektu, na kterém jsem chtěl Lean Query použít a ve které bych určitě řazení a limitování potřeboval, jsem po důkladném zvážení nakonec zjistil, že na něm Lean Query vyloženě nepotřebuji a vystačím si se samotným Lean Mapperem.
Implementace na úrovni SQL skýtá jednu záludnost. Jakmile k hlavní tabulce (té z klauzule FROM
) připojíte nějakou odkazující tabulku (například FROM author JOIN book ON author.id = book.author_id
), nelze LIMIT v SQL použít, respektive to nedává smysl.
Robustní implementace by si měla hlídat, kdy je na doménový dotaz možné ještě aplikovat SQL limit/offset a kdy už není. Co dělat ve druhém případě? Nepovolit limit/offset aplikovat? A vyhodit ho z dotazu, pokud už nastaven byl? Anebo by ho to mělo převést na nějakou in-memory variantu? To ale může být velká výkonnostní past…
Vím o tom. Jde o první věc, kterou budu implementovat v týdnu od 14. července, až se vrátím z dovči. :)