Strapi之接口设计

437 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

引言

Strapi的使用其实内容非常多,为此,本文仅针对部分内容着重讲解。我们知道,strapi的接口设计无非是增删查改。本文着重于查询中的筛选部分。并且,本文接口设计基于GraphQL,而不是RESTful API。

Filters

查询可以接受具有以下语法的筛选器参数: filters: { field: { Operator: value }} 还可以使用逻辑运算符(and,or,not)并接受对象的数组。 下列操作可供选择:

操作符解释
eq等于
ne不等于
lt小于
lte小于等于
gt大于
gte大于等于
in属于
notIn不属于
contains包含
notContains不包含
containsi包含,不区分大小写
notContainsi不包含,不区分大小写
null为空
notNull不为空
between在...区间内
startsWith开始于
endsWith结束于
and逻辑和
or逻辑或
not逻辑否

详细示例:

{
  documents(filters: { name: { eq: "test" }, or: [{ price: { gt: 10 }}, { title: { startsWith: "Book" }}] }) {
    data {
      id
    }
  }
}

Sorting

查询可以接受具有以下语法的排序参数: 基于单个值进行排序:sort: "value" 基于多个值进行排序:sort: [“ value1”,“ value2”] 排序顺序可以定义为: asc (升序,缺省,可以省略)或: desc (降序)。 详细示例:

{
  documents(sort: ["title:asc", "price:desc"]) {
    data {
      id
    }
  }
}

Pagination

查询可以接受分页参数。结果可以按页或偏移量分页。不能混合使用分页方法。要么按页数,也么按偏移量。我这里指介绍较为常见的按页数分页。

参数结束默认值
pagination[page]页码1
pagination[pageSize]一页大小10

详细示例:

{
  documents(pagination: { page: 1, pageSize: 10 }) {
    data {
      id
    }
    meta {
      pagination {
        page
        pageSize
        pageCount
        total
      }
    }
  }
}

示例

我们假设我们有这样一个表

query{
     articles{
        data{
          id
          attributes{
            title
            viewed
            liked
            commented
            summary
            cover
            createdAt
            authorId{
              data{
                attributes{
                  name
                }
              }
            }
            tagIds{
              data{
                attributes{
                  tag
                }
              }
            }
          }
        }
      }
}

现在,我们有一个需求,我们想要按热度降序排序,并且时间限制是本周内,并且带有分页功能。 那么我们可以设计以下逻辑:

先筛选出本周内的数据,然后按热度降序排序,配合分页功能。

时间筛选

articles(
      filters: { createdAt: { gte: "2023-01-25T00:00:00.000Z" }}
    )

热度排序

     articles(
      filters: { createdAt: { gte: "2023-01-25T00:00:00.000Z" }}
      sort: "viewed:desc"
    )

分页

     articles(
      filters: { createdAt: { gte: "2023-01-25T00:00:00.000Z" }}
      sort: "viewed:desc"
      pagination: { page: 1, pageSize: 20 }
    )

引用

docs.strapi.io/developer-d…