Symfony 5中Omines DataTable分页失效问题求助
在Symfony 5中使用Omines DataTable Bundle处理200万条数据分页时,组件始终返回全量数据,而非设定的限定数量。尝试在QueryBuilder中用limit和setMaxResults获取200000条数据,但结果依旧返回全部数据。奇怪的是,dump$paginator->getIterator()时显示的是已分页的目标数据,推测未掌握该Bundle结合Doctrine Paginator的正确用法。
控制器代码如下:
->createAdapter( ORMAdapter::class, [ 'entity' => ReportOmPaiement::class, 'query' => [ function (QueryBuilder $builder) { $limit = 200000; $query = $builder->select('c') ->from(ReportOmPaiement::class, 'c') ->leftJoin('c.Company', 'com') ->leftJoin('c.Client', 'client') ->orderBy('c.id', 'ASC'); $paginator = new Paginator($query, true); $paginator ->getQuery() ->setFirstResult(0) ->setMaxResults($limit); $lasPage = (int) ceil($paginator->count() / $paginator->getQuery()->getMaxResults()); $paginator->getIterator(); } ] ] )
返回结果控制台截图显示返回全量数据。
问题出在你错误地在ORMAdapter的query回调里手动创建Doctrine Paginator,Omines DataTable Bundle的ORMAdapter本身已经内置分页处理逻辑,你的手动操作不会被Bundle识别,最终还是会执行原始的全量查询。
正确用法分为两种:
方式一:利用Bundle内置分页(推荐)
ORMAdapter会自动根据前端DataTable的分页参数(如start、length)处理分页,无需手动调用setMaxResults。如果需要强制设置单次最大返回条数(比如限制最多拉20万条),可在Adapter配置中添加pageLength,或在DataTable前端配置里设置:
->createAdapter( ORMAdapter::class, [ 'entity' => ReportOmPaiement::class, 'query' => function (QueryBuilder $builder) { $builder->select('c') ->from(ReportOmPaiement::class, 'c') ->leftJoin('c.Company', 'com') ->leftJoin('c.Client', 'client') ->orderBy('c.id', 'ASC'); }, // 可选:设置默认每页条数,前端可覆盖 'pageLength' => 200000 ] ) // 同时在DataTable配置里启用分页 ->add('pageLength', 200000)
方式二:手动控制查询分页(仅适用于无前端交互场景)
如果一定要手动处理分页,需确保直接修改QueryBuilder的分页参数,不要创建额外的Paginator,ORMAdapter会基于修改后的QueryBuilder执行查询:
->createAdapter( ORMAdapter::class, [ 'entity' => ReportOmPaiement::class, 'query' => function (QueryBuilder $builder) { $limit = 200000; $offset = 0; $builder->select('c') ->from(ReportOmPaiement::class, 'c') ->leftJoin('c.Company', 'com') ->leftJoin('c.Client', 'client') ->orderBy('c.id', 'ASC') ->setFirstResult($offset) ->setMaxResults($limit); } ] )
注意:这种方式会固定分页参数,无法响应前端的分页切换请求,仅适合不需要前端交互分页的场景。
内容的提问来源于stack exchange,提问作者Louis Bingana

