Jak rozjet paginator s Doctrine?

jikki
Člen | 73
+
0
-

Ahoj,

poradil by prosím někdo jak rozjet iPub/VisualPaginator s Doctrine? hledal jsem, ale nenašel žádný příklad. S Doctrine začínám a mám v tom zatím docela choas. Paginator mi funguje s Nette Database Explorer bez problému, ale neumím jej napojit na Doctrine.

Děkuji

Phalanx
Člen | 310
+
0
-

Ahoj, nic složitého v tom nehledej (v podstatě stejné jako s Nette Database). Stačí ti dva dotazy do [model|repository|facade] na count a filtr dat
https://forum.nette.org/…ualpaginator#…

Klidně sem hoď kód, když ti něco nebude fungovat nebo nebudeš vědět.

Editoval Phalanx (25. 9. 2018 8:45)

jikki
Člen | 73
+
0
-

Phalanx napsal(a):

Ahoj, nic složitého v tom nehledej (v podstatě stejné jako s Nette Database). Stačí ti dva dotazy do [model|repository|facade] na count a filtr dat
https://forum.nette.org/…ualpaginator#…

Klidně sem hoď kód, když ti něco nebude fungovat nebo nebudeš vědět.

Díky za nakopnutí :) mám trochu zmatek v tom získávání dat. Jestli rozumím správně, tak data lze získat z repository, pak pomocí QueryBuilderu, Query(dql), NativeQuery(sql).

Pokud data získávám z repository, tak v paginatoru mám tohle, funguje to:

$visualPaginator = $this['visualPaginator'];
$paginator = $visualPaginator->getPaginator();
$paginator->itemsPerPage = $this->itemsPerPage;
$paginator->itemCount = $this->repository->countBy($criteria);
$this->template->tableData= $this->repository->findBy($criteria, [$order => $type], $paginator->itemsPerPage, $paginator->offset);

Potřebuji i složitější dotazy a získávat hodnoty z jiných tabulek přes cizí klíče a přes repository toho zřejmě nejde docílit, aspoň jsem nezjistil jak, tak budu muset získat data např přes QueryBuilder. Tady si nejsem ale jistý jak to udělat.
Mohl bys mě prosím ještě nakopnout?

Díky moc za pomoc

Phalanx
Člen | 310
+
0
-

@jikki Neboj, na to časem přijdeš, základy jak je vidět znáš.

Pokud je už logika složitější nebo se opakuje na více místech, pak bys měl dávat metodu pro získání dat do Repository nebo Facade.

Pokud je dotaz složitější (např. spojuješ více tabulek), můžeš si vytvořit query builder nebo nativní SQL.

<?php
		$qb = $this->getDoctrineRepository()->createQueryBuilder('d');
		$qb->select("dom.id, dom.title AS text")
			->innerJoin('d.domains', 'dom')
			->where('dom.deleted=0 AND d.id=:user_id')
            ->setFirstResult(0) // tady máš offset
            ->setMaxResults(20) // tady limit
			->setParameter('user_id', $userId);

		$data = $qb->getQuery()->getResult();
?>
jikki
Člen | 73
+
0
-

@Phalanx Nejsem si jistý jak to myslíš. Jak dám složitější metodu do repository nebo facade?

Momentálně řeším, že v paginátoru budu muset asi nějak rozpoznávat, zda jdou data z repository->findBy nebo z queryBuilder. Každé se počítá a stránkuje jiným způsobem. Nebo lze to nějak sjednotit? Snažím se vyrobit komponentu tabulku s vestavěným paginatorem, kterou chci použít do svého projektu.

U Nette Database Explorer to bylo jednodušší, tam jsem pracoval se Selection a mohl jsem to limitovat jak chtěl. Tady mi to připadá komplikovanější.

Editoval jikki (2. 10. 2018 10:21)