shu*_*van 3 php symfony doctrine-orm
我有实体用户,例如计数 90355,我需要得到 100 个用户并与这个用户做一些逻辑。然后接下来 100 次使用,这是我拥有的,但是当我找到所有服务器下拉列表时如何解决这个问题?
public function find()
{
$developers = $this->em->getRepository('ArtelProfileBundle:Users')->findBy(array(), array('id' => 'desc'));
foreach ($developers as $developer) {
$this->getApiFullContact($developer);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我想这个函数但是 setFirstResult 和 setMaxResults 动态变量?
public function getPaginationUser()
{
$qb = $this->getEntityManager()->createQueryBuilder('d');
$qb
->select('d')
->from('ArtelProfileBundle:Users', 'd')
->setFirstResult(0)
->setMaxResults(100)
->orderBy('d.id', 'DESC')
->getQuery()
->getResult()
;
$query = $qb->getQuery();
$results = $query->getResult();
return $results;
}
Run Code Online (Sandbox Code Playgroud)
这个迭代怎么做?
我把这个例子从我发现的一些东西中结合起来,它似乎有效。这是非常基本的,但它是一个开始。
所以答案:Doctrine2 分页器获得总结果
Symfony Docs:使用 Doctrine 的查询构建器查询对象
/**
* @Route("/users/{page}", name="user_list", requirements={"page"="\d+"})
*/
public function getUsersByPage($page = 1)
{
// get entity manager
$em = $this->getDoctrine()->getManager();
// get the user repository
$developers = $em->getRepository(Users::class);
// build the query for the doctrine paginator
$query = $developers->createQueryBuilder('u')
->orderBy('d.id', 'DESC')
->getQuery();
//set page size
$pageSize = '100';
// load doctrine Paginator
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
// you can get total items
$totalItems = count($paginator);
// get total pages
$pagesCount = ceil($totalItems / $pageSize);
// now get one page's items:
$paginator
->getQuery()
->setFirstResult($pageSize * ($page-1)) // set the offset
->setMaxResults($pageSize); // set the limit
foreach ($paginator as $pageItem) {
// do stuff with results...
dump($pageItem);
}
// return stuff..
return [$userList, $totalItems, $pageCount];
}
Run Code Online (Sandbox Code Playgroud)
完整的工作示例在这里 ->在教义查询构建器中使用限制和偏移量进行手动分页。我只是给你一些你需要首先理解的代码。
这就是它的工作原理,对我来说这是最好的做法!也许不适合其他人!
回购协议
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);
}
}
Run Code Online (Sandbox Code Playgroud)
寻呼机特征
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;
}
}
Run Code Online (Sandbox Code Playgroud)
服务
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21631 次 |
| 最近记录: |