LeanMapper a visualpaginator

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tirus91
Člen | 199
+
0
-

@Šaman a @Tharos
Jak mohu předat offset a limit kolekci?
V případě, že bych chtěl využívat VisualPaginator, tak mne nijak nenapadá, jak v rámci jednoho findAll() získat jak celkový počet záznamů, tak i aplikovat offset s limitem.

Jak tedy na to?

Šaman
Člen | 2666
+
0
-

Myslím, že tohle by řešil LeanQuery, ale nevím v jakém je stadiu vývoje.

Tirus91
Člen | 199
+
0
-

@Šaman
a jak řešíš ty stránkování? v tuto chvíli to začíná vypadat, že budu vše přepisovat do nette database :(

Jan Tvrdík
Nette guru | 2595
+
0
-

Na získání celkového počtu záznamů a zároveň výběr dat s limitem a offsetem potřebuješ pokud vím v MySQL vždy dva dotazy.

Tharos
Člen | 1030
+
0
-

@Tirus91: Existuje hned několik možností, jak s Lean Mapperem stránkování vyřešit…

Ukázal bys zde kousek kódu toho repositáře, abychom na to mohli navrhnout řešení, které by Tě stálo nejméně práce při aplikaci?

Editoval Tharos (25. 9. 2014 8:57)

Tirus91
Člen | 199
+
0
-

@Tharos
Určitě bych mohl

<?php

namespace Tirus\Repository;

/**
 * @method Topic getByUri($uri) Vrátí uživatele podle sloupce email.
 */
class ArticleRepository extends \LeanModel\Repository {

    public function deleteByTopic($arg) {
        return $this->connection->delete($this->getTable())->where('topic_id = ?', $arg)->execute();
    }

    public function findAllPublishedAndNotDeleted($visible = true, $orderBy = null, $offset = null, $limit = null) {
        $selection = $this->connection->select('*')
                ->from($this->getTable())
                ->where('published=%b', true)
                ->where('deleted=%b', false);

        if ($visible) {
            $selection = $selection->where('visible=%b', $visible);
        }
        if ($orderBy != null) {
            $selection = $selection->orderBy($orderBy);
        } else {
            $selection = $selection->orderBy('composed DESC');
        }
        if ($offset) {
            $selection = $selection->offset($offset);
        }
        if ($limit) {
            $selection = $selection->limit($limit);
        }

        $selection = $selection->fetchAll();
        return $this->createEntities($selection);
    }

    public function findAll($orderBy = null, $offset = null, $limit = null) {
        $statement = $this->connection->select('*')->from($this->getTable());
        if ($orderBy !== null) {
            $statement->orderBy($orderBy);
        }
        return $this->createEntities(
                        $statement->fetchAll($offset, $limit)
        );
    }

}
Pavel Macháň
Člen | 282
+
0
-

Já si do repozitáře pošlu Paginator něco ve stylu (ja to mám ještě trochu jinak kvůli fasádám):

public function findAllSomething(Paginator $paginator) {
    $paginator->setItemCount($this->findCountSomething());

		$statement = ....

    return $this->createEntities(
			$statement->fetchAll($paginator->getOffset(), $paginator->getItemsPerPage()));
}

Editoval Pavel Macháň (25. 9. 2014 12:42)

Tharos
Člen | 1030
+
0
-

@Tirus91: V té Tvé ukázce by úplně stačilo doplnit si do repositáře zhruba takovouto metodu:

findCount() {
	$statement = $this->createFluent();
	return $statement->removeClause('select')->select('COUNT(*)')->fetchSingle();
}

S tím, že pomocí dalších parametrů a vhodného zobecnění bys snadno mohl získávat počet záznamů i pro ty další specifické findBy<Parametry> metody.

Tirus91
Člen | 199
+
0
-

@Tharos
to jsem nějak nepochopil… :(

Mohl bych tě požádat o příklad? Nebo zda bys měl čas a nemohli bychom si napsat na ICQ, SKYPE nebo někde. Stačilo by mne trochu více nakopnout správným směrem

Editoval Tirus91 (25. 9. 2014 19:37)

duke
Člen | 650
+
+1
-

Pokud používáš MySQL, můžeš také alternativně použít speciální option SQL_CALC_FOUND_ROWS:

$statement->setFlag('SQL_CALC_FOUND_ROWS');
$rows = $statement->fetchAll();
$result = $this->connection->nativeQuery('SELECT FOUND_ROWS()');
$totalCount = (int) $result->fetchSingle();
Tharos
Člen | 1030
+
0
-

@Tirus91: Klidně se mi ozvi na Skype (v.kohout), jestli je to stále aktuální.