这是我参与「第五届青训营 」伴学笔记创作活动的第 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 }
)