我正在使用Doctrine2进行可能获得大量流量的项目,我很想在搜索页面中进行一些分页,并且每页只能获取5个结果 那么有没有一个很好的方法来做到这一点,而不需要使用教义扩展和保持ORM抽象层?我的意思是我不想写任何形式的dql查询并保持我的代码格式:
$repo= $this->getDoctrine()
->getEntityManager()
->getRepository('AcmeOfficeBundle:Project');
$list=$repo->findBy(array('PROJ_private' => "0"));
答案 0 :(得分:36)
Doctrine 2.2 ships with a paginator。但是, 要求您编写DQL查询。
如果你坚持不编写任何DQL,你可以从查看Doctrine EntityRepository类开始;具体而言,the findBy() method。它有限制和偏移的可选参数,因此您可以尝试这样的事情(使用您的示例作为基线):
$num_pages = x; // some calculation of what page you're currently on
$repo = $this->getDoctrine()
->getRepository('AcmeOfficeBundle:Project');
$list = $repo->findBy(
array('PROJ_private' => "0"), //search criteria, as usual
array(/* orderBy criteria if needed, else empty array */),
5, // limit
5 * ($num_pages - 1) // offset
);
答案 1 :(得分:1)
在Doctrine ORM 2.3中,您还可以在实体存储库中使用Criteria
和matching
。现在(截至2.5)与nToMany关系有效。
当您的查询需要除equals之外的其他比较或分页另一个实体的OneToMany集合时,这会有所帮助。
$page = (isset($_GET['page']) && $_GET['page'] > 0 ? $_GET['page'] : 1);
$limit = 20;
$offset = ($limit * ($page - 1));
$criteria = \Doctrine\Common\Collections\Criteria::create()
->setMaxResults($limit)
->setFirstResult($offset);
$expr = $criteria->expr();
$user = $em->getRepository('AcmeOfficeBundle:Project')
->matching($criteria->where($expr->gt('PROJ_private', 0)));
$total_records = $user->count();
答案 2 :(得分:0)
避免编写DQL的一个好方法是使用Pagerfanta
对集合进行操作https://github.com/whiteoctober/Pagerfanta
use Pagerfanta\Adapter\DoctrineCollectionAdapter;
$user = $em->find("App\DoctrineORM\User", 1);
$adapter = new DoctrineCollectionAdapter($user->getGroups());