不会后端不用愁,Strapi解你忧——Strapi后台数据表创建及API联调测试,实现查询文章及关联的分类、标签、评论等表连接查询
前边已经介绍过了Strapi创建博客系统的数据表设计,这里就Strapi后台创建“数据表”进行介绍。
注意,这里的创建数据表要实现表连接,不再是前边简单的创建个表能通过API查询到就行了,搭建博客系统最常用的功能是要获取文章及其分类、标签和评论等内容的。
同时,创建好相关数据表,设置好表连接关系之后,我们还要创建几条测试数据,然后使用Postman进行API查询测试,保证能完整的获取到我们需要查询的文章及其关联的分类、标签及评论。
因篇幅有限,本文着重介绍POST/Category/Tag三个表的配置及API调试。
1. Category(分类):
- name:分类名称,必填,短文字(2-20个字符长度)
- description:分类描述,非必填,短文字(短文本默认0-255个字符也够用了)
- parentId:上级分类id,非必填,短文字,对应上级分类的documentId(最大长度24)
- Relation (oneToMany) with Post :一个分类对应多篇文章

name字段需要配置必填栏位、最小长度2,最大长度20,虽然Strapi已经做了数据格式控制,但进行必要的字段长度设置有利于减少脏数据。

ParentId字段设置最大传唱度24,其他无需设置

表关系设置这里选择Post,Category属于许多Posts

对于Category数据类型的设置,按这个就可以了,也可以根据自己的需要进行调整。
2. Tag(标签):
- name:标签名称,短文字,必填,1-20个字符
- Relation (manyToMany) with Post :标签与文章多对多的关系



3. POST(文章):
- title*:文章标题,短文本,必填,1-200
- markdown:是否开启markdown编辑内容,Boolean,默认false,展示富文本(Block),为true则展示富文本(Markdown)
- content*:文章内容,富文本(Block),必填
- contentMd*:文章内容,富文本(Markdown),必填,与content通过markdown字段切换展示
- excerpt:文章摘要,短文本,非必填,1-255
- cover:封面图,非必填
- isPublished:是否发布,Boolean,为true则发布,false则存为草稿
- Relation (manyToMany) with Tag:Post与Tag多对多关系
- Relation (manyToOne) with Category :Post与Category多对一关系

使用markdown控制文章内容类型是Block还是Markdown,默认false,非必填

content/contentMd两个字段分别记录两种类型的文章内容输入


Post与Category为多对一关系,与Tag为多对多关系


主要的几个数据表创建完了,记得一定要点击左上角的保存按钮,服务器重启数据才会生效的,下一步我们来创建测试数据。
Content Manager页面,给Category/Tag两个表先添加两条测试数据,后边再创建Post数据
1. Category:
Category支持多级,但Strapi后台是不显示documentId的,所以在创建测试数据的时候就先不考虑多级分类了。

2. Tag:
3. POST:
文章内容输入框默认显示传统输入框

点击markdown选择是,切换为Markdown输入框

输入框下边可以输入博文摘要,上传博文封面图片,还可以选择分类及标签。
虽然现实了isPublish字段,但这个字段是为了给Api调用使用的,这里的可以不用理会,直接通过右上角的发布、保存按钮操作。


虽然我们已经创建了相关数据表及测试数据,但Strapi中Public角色默认是没有任何权限的,即使是读取权限,这就需要我们自己设置了。
设置-用户及权限插件-角色页面,点击Public右侧的编辑按钮

根据需要,给Public角色添加Category/Tag/Post/Comment等用户可以匿名访问到的这些数据信息表添加find/findOne权限,点击右上角保存按钮,才能使用API查询相关数据。

1. 文章列表,含分类、标签
GET http://localhost:1337/api/posts?populate[category][fields][0]=name&populate[tags][fields][0]=name
如果不会写,可以借住AI,输入几个表之间的关系,AI会直接给出对应的查询API链接
返回数据如下:
{ "data": [ { "id": 2, "documentId": "zs2rv5bgwy6n1q0bmghoac3c", "createdAt": "2026-04-16T14:07:20.772Z", "updatedAt": "2026-04-16T14:07:36.790Z", "publishedAt": "2026-04-16T14:07:36.818Z", "title": "我的第一篇Strapi博文", "markdown": false, "content": [ { "type": "paragraph", "children": [ { "text": "我的第一篇Strapi博文", "type": "text" } ] } ], "contentMd": null, "excerpt": "博文摘要", "isPublished": null, "category": null, "tags": [ { "id": 1, "documentId": "cnbn3qnjpmm95zp6b9s9onbg", "name": "vue" }, { "id": 2, "documentId": "tsrmcyw7t8wi19raxdvycy7w", "name": "strapi" } ] }, { "id": 4, "documentId": "byy7cfuxkem6r53jb0f8t93u", "createdAt": "2026-04-17T06:15:52.554Z", "updatedAt": "2026-04-17T06:15:52.554Z", "publishedAt": "2026-04-17T06:15:52.591Z", "title": "没有分类和标签的文章", "markdown": false, "content": [ { "type": "paragraph", "children": [ { "text": "没有分类和标签的文章", "type": "text" } ] } ], "contentMd": null, "excerpt": null, "isPublished": false, "category": null, "tags": [] } ], "meta": { "pagination": { "page": 1, "pageSize": 25, "pageCount": 1, "total": 2 } } }
2. 单篇文章详情(含分类 + 标签 + 评论 + 评论回复)
先来个直接返回包含所有相关数据的简洁API,直接用 populate=*,让 Strapi 自动展开所有关系,不用自己写复杂参数,小白首选,新手零出错。
GET http://localhost:1337/api/posts/${id}?populate=*
将其中的${id}替换为文章的documentId即可,返回数据如下:
{ "data": { "id": 5, "documentId": "zs2rv5bgwy6n1q0bmghoac3c", "createdAt": "2026-04-16T14:07:20.772Z", "updatedAt": "2026-04-17T08:29:37.992Z", "publishedAt": "2026-04-17T08:29:38.040Z", "title": "我的第一篇Strapi博文", "markdown": false, "content": [ { "type": "paragraph", "children": [ { "text": "我的第一篇Strapi博文", "type": "text" } ] } ], "contentMd": null, "excerpt": "博文摘要", "isPublished": null, "cover": null, "tags": [ { "id": 1, "documentId": "cnbn3qnjpmm95zp6b9s9onbg", "name": "vue", "createdAt": "2026-04-16T15:18:05.739Z", "updatedAt": "2026-04-16T15:18:05.739Z", "publishedAt": "2026-04-16T15:18:05.729Z" }, { "id": 2, "documentId": "tsrmcyw7t8wi19raxdvycy7w", "name": "strapi", "createdAt": "2026-04-16T15:18:43.384Z", "updatedAt": "2026-04-16T15:18:43.384Z", "publishedAt": "2026-04-16T15:18:43.373Z" } ], "comments": [], "category": { "id": 1, "documentId": "kpkjdb7xhr0ie87z0yie1uvj", "name": "前端开发", "description": null, "parentId": null, "createdAt": "2026-04-16T15:13:46.440Z", "updatedAt": "2026-04-16T15:13:46.440Z", "publishedAt": "2026-04-16T15:13:46.427Z" } }, "meta": {} }
注意:
?populate=*是 Strapi 官方推荐写法,自动深度关联所有关系:
分类 category ✔
标签 tags ✔
评论 comments ✔
评论回复 parent ✔
封面图片 cover ✔
完全满足你要的关联查询。
3. 如果你想严格控制只取需要的字段(推荐生产环境)
http://localhost:1337/api/posts/zs2rv5bgwy6n1q0bmghoac3c?fields=title,content,publishedAt&populate[category][fields]=name&populate[tags][fields]=name&populate[comments][fields]=authorName,content,createdAt
{ "data": { "id": 5, "documentId": "zs2rv5bgwy6n1q0bmghoac3c", "title": "我的第一篇Strapi博文", "content": [ { "type": "paragraph", "children": [ { "text": "我的第一篇Strapi博文", "type": "text" } ] } ], "publishedAt": "2026-04-17T08:29:38.040Z", "category": { "id": 1, "documentId": "kpkjdb7xhr0ie87z0yie1uvj", "name": "前端开发" }, "tags": [ { "id": 1, "documentId": "cnbn3qnjpmm95zp6b9s9onbg", "name": "vue" }, { "id": 2, "documentId": "tsrmcyw7t8wi19raxdvycy7w", "name": "strapi" } ], "comments": [] }, "meta": {} }
自此,我们已经可以实现Strapi的表连接查询了,就可以先试着搭建前端框架,调用查询文章的相关API制作博客文章展示页面了。
注意事项:
1. 本文介绍了使用AI IDE初始化项目、Axios封装、Strapi相关api的请求封装,以及完成真实API调用的文章列表及详情的基础页面。无论是React还是Vue,亦或者Angular,都可以按照这个流程来走,也可以借助于AI聊天工具设计具体的指令,切记,投喂AI的指令很重要,决定了AI生成代码的准确度与质量。
2. Strapi5的数据结构有了大的改变,所以指令中要多提示,避免AI误用Strapi4的相关写法。
3. Strapi除了User表,其他数据表都是自定义创建,所以API URL最好在Postman中调试好,再拿来投喂AI,根据需要使用全量数据返回及或者必要数据返回。
浙公网安备 33010602011771号