【发布时间】:2019-02-01 20:57:01
【问题描述】:
我正在建立一个 Symfony 项目,显示带有管理界面的分页博客文章来管理所有这些内容。在此管理员上,还可以“突出显示”其中一个公共博文,以便突出显示的博文仅显示在第一页的第一个位置。
我需要每个页面上的项目数相同,这就是我要处理的问题。
我正在使用PagerFanta,所以我创建了一个带有“分页”功能的 AbstractRepository。
protected function paginate(QueryBuilder $qb, $limit = 20, $offset = 0)
{
if ($limit == 0) {
throw new \LogicException('$limit must be greater than 0.');
}
//Instantiates the pagination object with the result of the query
$pager = new Pagerfanta(new DoctrineORMAdapter($qb));
//Sets max data per page
$pager->setMaxPerPage($limit);
//Sets the current page
$pager->setCurrentPage($offset);
return $pager;
}
在我的博文存储库中,我创建了一个查询构建器来获取所有公共博文,但突出显示的博文除外,因为我可以通过另一种方式将其显示在第一页的顶部。
public function findAllVisible($id, $limit = 3, $offset = 1, $order = 'DESC')
{
$qb = $this
->createQueryBuilder('a')
->select('a')
->where('a.website = :website')
->setParameter('website', 'blog')
->andWhere('a.public = :public')
->setParameter('public', true)
->andWhere('a.id != :id')
->setParameter('id', $id)
->orderBy('a.dateInsert', $order)
;
return $this->paginate($qb, $limit, $offset);
}
所以我首先尝试根据当前页面更改限制和偏移量,但逻辑上我在第一页和第二页之间丢失了一个项目。
然后我尝试在 querybuilder 中包含突出显示的博客文章,但如果当前页面是第一个页面,我不知道如何将其定义为第一个结果。
您知道如何强制第一个结果仅在首页上突出显示吗?还是按预期显示结果的另一种干净且适当的方式?
【问题讨论】:
标签: symfony doctrine-orm