有没有办法使用 ApiPlatform 分页来获取总项目?

Posted

技术标签:

【中文标题】有没有办法使用 ApiPlatform 分页来获取总项目?【英文标题】:Is there a way to get total items using ApiPlatform Pagination? 【发布时间】:2021-05-22 09:18:49 【问题描述】:

我正在尝试使用 bootstrap-vue 对表客户端进行分页。我试图分页的 api 资源实际上有 44 个项目。

bootstrap-vue 分页组件需要一个 total-row 属性来获取总页数(基于每页的项目)/resourceGET 响应返回 hydra:totalItems: 15

15 实际上是我在 App/config/packages/api_platform.yaml 配置中的默认 itemsPerPage,如下:

collection:
exists_parameter_name: 'exists'
order: 'DESC'
order_parameter_name: 'order'
pagination:
  enabled: true
  partial: true
  client_enabled: true
  client_items_per_page: true
  client_partial: true
  items_per_page: 15
  maximum_items_per_page: 100
  page_parameter_name: 'page'
  enabled_parameter_name: 'pagination'
  items_per_page_parameter_name: 'itemsPerPage'
  partial_parameter_name: 'partial'

partial=true/false 和 ?itemsPerPage=x 的结果相同。 分页本身正在工作:如果我调用 ?page=1?page=2 我得到正确的项目,但 hydra:totalItems 总是指基于 itemsPerPage 参数返回的项目。

另外,根据ApiPlatform docs,我还应该收到一个hydra:view 对象,其中包含关于下一个、上一个和最后一个项目的信息,只是在服务器上使用其默认值启用分页,但它不在响应中。

有没有办法接收分页集合和总数? 当前配置: ApiPlatform v. 1.2.2 Symfony 5.1

【问题讨论】:

使用 api 平台 2.6,我确实得到了查询结果中的总行数,与分页无关。也许你可以更新api平台? The releases page 表示“旧版本(1.x、2.0...)不再维护。如果您仍在使用它们,则必须尽快升级。” 如果您的 api 返回 jsonld,您应该获得 hydra:view 对象。如果确实是您允许返回的格式配置问题(api_platform.yaml),您必须在请求中使用正确的 mime_type 【参考方案1】:

我将此问题视为业务逻辑,而不是 API 平台功能

我相信最简单的方法是在实体的对象存储库中实现一个查询,该查询计算记录总数并使用 getter 返回到您的实体的属性。

了解如何通过 Symfony 文档Querying for Objects: The Repository 实现这一目标

【讨论】:

这是我的第一个想法,但是通过这种方法,我会在每个对象中得到一个 totalitems 字段,这也是有效的;但我需要它在外面 数据传输对象 (DTO) 可能是您的解决方案 api-platform.com/docs/core/dto

以上是关于有没有办法使用 ApiPlatform 分页来获取总项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Pageable 的 Spring Data JPA 分页来更改数据?

烧瓶 - 不安分使用分页或得到完整的回应

Joomla K2 通过将页码添加到分页来更改分页标题

cakePHP 使用 post 数据分页,无需会话、序列化或 post 来获取

jQuery DataTables 是在单个请求中还是使用分页从数据库中获取所有数据?

具有多列的基于 MySQL 游标的分页