完全工作的例子就是在这里 - >Using limit and offset in doctrine query builder for manual pagination。我只是给你你需要先了解的代码。
这是它的工作原理,对我来说这是最佳实践!也许不适合其他人!
- 请求转到控制器
- 控制器调用服务与性状
- 服务标准化请求参数
- 服务从信息库提取数据
- 库返回结果返回到服务
- 服务传递导致为出厂
- 厂创建结果型号
- 厂返回结果型号回到服务
- 服务回报合成模型回控制器
REPO
namespace Application\BackendBundle\Repository;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
class StudentRepository extends EntityRepository
{
/**
* @param string|null $name
* @param int $limit
* @param int $offset
*
* @returns array
*/
public function findPaginatedByName($name, $limit, $offset)
{
$qb = $this->createQueryBuilder('s');
if ($name) {
$qb->where('s.name = :name')->setParameter('name', $name);
}
$qb->setMaxResults($limit)->setFirstResult($offset);
return $qb->getQuery()->getResult(Query::HYDRATE_SIMPLEOBJECT);
}
/**
* @param string|null $name
*
* @return int
*/
public function findPaginatedByNameCount($name)
{
$qb = $this->createQueryBuilder('s')->select('COUNT(s)');
if ($name) {
$qb->where('s.name = :name')->setParameter('name', $name);
}
return $qb->getQuery()->getResult(Query::HYDRATE_SINGLE_SCALAR);
}
}
寻呼机特质
namespace Application\BackendBundle\Util;
trait PagerTrait
{
public function getPage($page = 1)
{
if ($page < 1) {
$page = 1;
}
return floor($page);
}
public function getLimit($limit = 20)
{
if ($limit < 1 || $limit > 20) {
$limit = 20;
}
return floor($limit);
}
public function getOffset($page, $limit)
{
$offset = 0;
if ($page != 0 && $page != 1) {
$offset = ($page - 1) * $limit;
}
return $offset;
}
}
服务
namespace Application\BackendBundle\Service;
use Application\BackendBundle\Factory\StudentFactoryInterface;
use Application\BackendBundle\Model\Student\Result;
use Application\BackendBundle\Repository\StudentRepository;
use Application\BackendBundle\Util\PagerTrait;
class StudentService implements StudentServiceInterface
{
use PagerTrait;
private $studentRepository;
private $studentFactory;
public function __construct(
StudentRepository $studentRepository,
StudentFactoryInterface $studentFactory
) {
$this->studentRepository = $studentRepository;
$this->studentFactory = $studentFactory;
}
/**
* @param string $name
* @param int $page
* @param int $limit
*
* @return Result
*/
public function get($name, $page, $limit)
{
$page = $this->getPage($page);
$limit = $this->getLimit($limit);
$offset = $this->getOffset($page, $limit);
$total = 0;
$result = $this->studentRepository->findPaginatedByName($name, $limit, $offset);
if ($result) {
$total = $this->studentRepository->findPaginatedByNameCount($name);
}
return $this->studentFactory->createStudentResult($result, $name, $page, $limit, $total);
}
}
只是做'($页面-1)* 100;'其中$页是数要求,并用它来代替0在setFirstResult中。也没有理由做getQuery/getResult两次。只需删除前两个电话。 – JimL
我怎么知道如何调用函数,也许第一个结果和最大结果动态变量?我更新我的问题 –
看看https:// github。com/KnpLabs/KnpPaginatorBundle –