NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:16.9.2017 10:37

Ahojte, mohli byste mi prosím pomoct problémem v sestavování dotazu?

Můj kód vypadá následovně:

/** @var array  */
protected $criteria = [];

/**
 * @param \Kdyby\Persistence\Queryable $repository
 * @return \Doctrine\ORM\Query|\Doctrine\ORM\QueryBuilder
 */
protected function doCreateQuery(Kdyby\Persistence\Queryable $repository)
{
        $qb =  $repository->createQueryBuilder()
                ->select('s')
                ->from('App\Model\Entities\Status', 's')
                ->orderBy('s.time', 'DESC');

        foreach ($this->criteria as $criteria) $criteria($qb);

        return $qb;
}

/**
 * @param int $page
 */
public function pubTables($page = 1)
{
        \Tracy\Debugger::barDump($page);
        $this->criteria[] = function (QueryBuilder $qb) use ($page){
                $qb->andWhere('s.section = '. Status::SECTION_PUB)
                        ->setFirstResult(($page - 1) * 20)
                        ->setMaxResults(20);
        };
}

Pak kód volám jednoduše:

/**
 * @param int $page
 * @return array|\Kdyby\Doctrine\ResultSet
 */
public function getPubTables($page = 1)
{
        $query = new StatusQuery();
        $query->pubTables($page);
        return $this->em->getRepository(Status::class)->fetch($query);
}

Problém je v tom, že se mi na dotaz neaplikují příkazy setFirstResult a setMaxResults a můj dotaz vypadá následovně:

SELECT s0_.title AS title_0, s0_.section AS section_1, s0_.closed AS closed_2, s0_.content AS
content_3, s0_.time AS time_4, s0_.images AS images_5, s0_.id AS id_6, s0_.user AS user_7
FROM status s0_
WHERE s0_.section = 0
ORDER BY s0_.time DESC

Cache jsem smazal a z dumpu v kódu vyplývá , že mi tam jde opravdu číslo 2, jak protřebuji.
Pokud byste mi pomohli dost by mi to pomohlo.

  • Díky
 
Odpovědět
16.9.2017 10:37
Avatar
Odpovídá na Jan Blažek
Martin Konečný (pavelco1998):16.9.2017 13:30

Ahoj, nevím přesně proč, ale Kdyby\Doctrine metody setFirstResult() a setMaxResults() nepodporuje. Je potřeba využít metodu applyPaging().

$query = new StatusQuery();
$query->pubTables();  // tam můžeš ty dvě metody vyhodit a nechat jen podmínku andWhere()

$result = $this->em->getRepository(Status::class)->fetch($query);

$result->applyPaging(($page - 1) * 20, 20)  // offset, limit;

return $result;
Editováno 16.9.2017 13:31
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
16.9.2017 13:30
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jan Blažek
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Jan Blažek:16.9.2017 14:49

Asi to stejně budu muset řešit přes čistý DQL dotaz, protože mi to zbytečně generuje 2 dotazy si myslím:

4.988
SELECT DISTINCT id_6
FROM (
SELECT s0_.title AS title_0, s0_.section AS section_1, s0_.closed AS closed_2, s0_.content AS
content_3, s0_.time AS time_4, s0_.images AS images_5, s0_.id AS id_6
FROM status s0_
WHERE s0_.section = 0) dctrn_result
ORDER BY time_4 DESC
LIMIT 20
OFFSET 0
.../latte/templates-Pub-default.latte--e6898423c1.php
2.919
SELECT s0_.title AS title_0, s0_.section AS section_1, s0_.closed AS closed_2, s0_.content AS
content_3, s0_.time AS time_4, s0_.images AS images_5, s0_.id AS id_6, s0_.user AS user_7
FROM status s0_
WHERE s0_.section = 0 AND s0_.id IN (12, 11, 10, 9, 8, 7, 6, 5)
ORDER BY s0_.time DESC
.../latte/templates-Pub-default.latte--e6898423c1.php

To nechápu. Podle mě by na to v pohodě stačilo něco jako:

SELECT *
FROM ...\Status s
WHERE s.status = 0
ORDER BY s.time DESC
LIMIT 20
OFFSET 0
Editováno 16.9.2017 14:50
 
Nahoru Odpovědět
16.9.2017 14:49
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:16.9.2017 14:59

Mám pravdu, nebo to tam není ?

 
Nahoru Odpovědět
16.9.2017 14:59
Avatar
Odpovídá na Jan Blažek
Martin Konečný (pavelco1998):16.9.2017 15:58

Zdá se, že to tam navíc je, i když (opět) nevím, proč je to řešené zrovna takto :D
Pokud potřebuješ složit dotaz dynamicky, pořád můžeš využít QueryBuilder, na něm by metody setFirstResult() a setMaxResults() fungovat měly.

Nahoru Odpovědět
16.9.2017 15:58
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.