Php 符号主义分页

Php 符号主义分页,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有实体用户,例如计数90355,我需要得到100个用户,并与这个用户做一些逻辑。然后下100次使用,这是我的,但当我找到我的服务器下拉菜单时,如何解决这个问题 public function find() { $developers = $this->em->getRepository('ArtelProfileBundle:Users')->findBy(array(), array('id' => 'desc')); foreach ($develo

我有实体用户,例如计数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;
}
我想我喜欢这个函数,但是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;
}

如何进行此迭代

这是未经测试的,但我认为这应该有效:

public function find($offset = 0)
{
    $developers = $this->em->getRepository('ArtelProfileBundle:Users')->findBy(array(), array('id' => 'desc'), 100, $offset);

    foreach ($developers as $developer) {
       $this->getApiFullContact($developer);
    }

    if (count($developers) < 100){
        $offset = $offset + 100;
        $this->find($offset)
    }      

    return new Response("finished!");  

}
公共函数查找($offset=0)
{
$developers=$this->em->getRepository('ArtelProfileBundle:Users')->findBy(array(),array('id'=>'desc'),100,$offset);
foreach($developers作为$developer){
$this->getApiFullContact($developer);
}
如果(计数($developers)<100){
$offset=$offset+100;
$this->find($offset)
}      
返回新的响应(“完成!”);
}
这里是一个完整的工作示例->。我只是给你一些你首先需要理解的代码

这就是它的工作原理,对我来说,这是最好的实践!也许不是对其他人

  • 请求转到控制器
  • 控制器呼叫服务
  • 带有Trait的服务规范化请求参数
  • 服务从存储库中提取数据
  • 存储库将结果返回给服务
  • 服务将结果传递给工厂
  • 工厂创建结果模型
  • 工厂将结果模型返回服务
  • 服务将结果模型返回给控制器
  • 回购

    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;
        }
    }
    

    我把这个例子从我发现的一些东西中组合起来,它似乎是有效的。这是非常基本的,但这只是一个开始

    因此,请回答:

    Symfony文档:


    如何在symfony上分页

    /**
     * @Route("", name="admin_number_pool", methods={"GET"})
     */
    public function index(NumberPoolRepository $repo, NumberPoolCategoryRepository $categories, Request $request): Response
    {
        $page = $request->query->get('page', 1);
        $limit = 10;
        $pagesCount = ceil(count($repo->findAll()) / $limit);
        $pages = range(1, $pagesCount);
        $pools = $repo->findBy([], [], $limit, ($limit * ($page - 1)));
    
    
        return $this->render('admin/number-pool/index.html.twig', [
            'numberPools' => $pools,
            'categories' => $categories->findAll(),
            'pages' => $pages,
            'page' => $page,
        ]);
    }
    

    只要做
    ($page-1)*100其中$page是请求的页码,并在setFirstResult中使用它而不是0。此外,没有理由执行两次getQuery/getResult。只需删除前面的两个调用。我如何知道如何调用函数以及first result和max result动态变量?我更新了我的问题看一看不需要渲染到模板我用cron运行命令并对用户执行一些逻辑操作,KnpPaginatorBundle对此有帮助吗?请分享更多详细信息。通过
    $repo->findAll()
    读取所有实体看起来有些过分,因为这样加载所有实体只是为了计数them@NicoHaase是的,你说得对。我在这里有点匆忙。事实上,如果数据库中有大量数据,这将是不切实际的。谢谢你的评论。
    /**
     * @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];
    }
    
    /**
     * @Route("", name="admin_number_pool", methods={"GET"})
     */
    public function index(NumberPoolRepository $repo, NumberPoolCategoryRepository $categories, Request $request): Response
    {
        $page = $request->query->get('page', 1);
        $limit = 10;
        $pagesCount = ceil(count($repo->findAll()) / $limit);
        $pages = range(1, $pagesCount);
        $pools = $repo->findBy([], [], $limit, ($limit * ($page - 1)));
    
    
        return $this->render('admin/number-pool/index.html.twig', [
            'numberPools' => $pools,
            'categories' => $categories->findAll(),
            'pages' => $pages,
            'page' => $page,
        ]);
    }