Skip to content

Instantly share code, notes, and snippets.

@sunvisor
Created December 28, 2019 01:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sunvisor/199295c77b38242f04cfde9ebc79da9c to your computer and use it in GitHub Desktop.
Save sunvisor/199295c77b38242f04cfde9ebc79da9c to your computer and use it in GitHub Desktop.
ページングしたときの総件数を得る関数を DQL に追加する
<?php
/** @noinspection PhpUnused */
namespace App\DQL;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\QueryException;
use Doctrine\ORM\Query\SqlWalker;
/**
* Class CountOver
*
* ページングしたときの総件数を得る関数を DQL に追加する
*
* config/packages/doctrine.yaml の orm キーの下に次を記述する
*
* orm:
* dql:
* string_functions:
* count_over: App\DQL\CountOver
*
* 使用する際は `count_over()` で総件数を取得できる
*
* $query = $em->getQuery('SELECT t, count_over FROM App\Entity\Table t')
* $query->setMaxResults(10)
* ->setFirstResult(11);
* $result = $query->getResult();
*
* または QueryBuilder で
*
* $qb->select('count_over() as total');
*
* @package App\DQL
*/
class CountOver extends FunctionNode
{
/**
* @inheritDoc
*/
public function getSql(SqlWalker $sqlWalker)
{
return "COUNT(*) OVER()";
}
/**
* @inheritDoc
* @throws QueryException
*/
public function parse(Parser $parser): void
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment