使用查询引擎 API 联表加载(populate)
页面摘要: 查询引擎 API 的
populate参数用于在查询中加载关联数据,支持基础联表加载、选择性字段、嵌套关联过滤,以及通过 populate 片段(fragments)处理多态结构。
WARNING
大多数情况下你不应使用 Query Engine API,而应使用 Document Service API。
只有当你能确定自己在做什么时才使用 Query Engine API,例如需要直接与数据库唯一行交互的底层 API。
请注意,Query Engine API 无法感知 Strapi 5 的高级功能,如草稿与发布、国际化、内容历史等。这也意味着 Query Engine API 无法使用 documentId,而会使用 id,这可能导致数据库层面的意外后果,或与 Strapi 5 功能出现部分或不完整的兼容性问题。
WARNING
在深入阅读 Query Engine API 文档之前,建议你先阅读以下介绍:
- 后端自定义介绍,
- 以及 Content APIs 介绍。
关联与组件共用一套统一的 API 来进行联表加载。
要联表加载所有根级关联,可使用 populate: true:
strapi.db.query('api::article.article').findMany({
populate: true,
});
通过传入属性名数组,选择要联表加载的数据:
strapi.db.query('api::article.article').findMany({
populate: ['componentA', 'relationA'],
});
可传入一个对象以进行更高级的用法:
strapi.db.query('api::article.article').findMany({
populate: {
componentB: true,
dynamiczoneA: true,
relation: someLogic || true,
},
});
通过应用 where 过滤器并选择或联表加载嵌套关联,也可实现复杂的联表加载:
strapi.db.query('api::article.article').findMany({
populate: {
relationA: {
where: {
name: {
$contains: 'Strapi',
},
},
},
repeatableComponent: {
select: ['someAttributeName'],
orderBy: ['someAttributeName'],
populate: {
componentRelationA: true,
},
},
dynamiczoneA: true,
},
});
在处理多态内容结构(动态区域、多态关联等)时,可使用 populate 片段,以更精细地控制联表加载策略。
strapi.db.query('api::article.article').findMany('api::article.article', {
populate: {
dynamicZone: {
on: {
'components.foo': {
select: ['title'],
where: { title: { $contains: 'strapi' } },
},
'components.bar': {
select: ['name'],
},
},
},
morphAuthor: {
on: {
'plugin::users-permissions.user': {
select: ['username'],
},
'api::author.author': {
select: ['name'],
},
},
},
},
});