使用实体服务 API 联表加载(populate)

页面摘要: 实体服务 API 的 populate 参数用于获取关联、组件与动态区域。使用 populate: '*' 可加载所有根级关联;使用数组可指定特定字段;使用对象可进行包含过滤与嵌套联表加载的高级查询;对于多态内容结构,可使用 populate 片段(fragments)。

WARNING

Entity Service API 在 Strapi v5 中已弃用。请考虑改用 Document Service API。

实体服务 API 默认不会联表加载(populate)关联、组件或动态区域,这意味着未使用 populate 参数的实体服务 API 查询不会返回有关关联、组件或动态区域的信息。

基础联表加载(Basic populating)

要联表加载所有根级关联,可使用 populate: '*':

const entries = await strapi.entityService.findMany('api::article.article', {
  populate: '*',
});

通过传入属性名数组,可联表加载多个组件或关联字段:

const entries = await strapi.entityService.findMany('api::article.article', {
  populate: ['componentA', 'relationA'],
});

高级联表加载(Advanced populating)

可传入一个对象以进行更高级的联表加载:

const entries = await strapi.entityService.findMany('api::article.article', {
  populate: {
    relationA: true,
    repeatableComponent: {
      fields: ['fieldA'],
      filters: {},
      sort: 'fieldA:asc',
      populate: {
        relationB: true,
      },
    },
  },
});

通过结合使用 filters 参数,可实现对嵌套关联或组件的选择与联表加载,从而完成复杂的联表加载:

const entries = await strapi.entityService.findMany('api::article.article', {
  populate: {
    relationA: {
      filters: {
        name: {
          $contains: 'Strapi',
        },
      },
    },

    repeatableComponent: {
      fields: ['someAttributeName'],
      sort: ['someAttributeName'],
      populate: {
        componentRelationA: true,
      },
    },
  },
});

Populate 片段(fragments)

在处理多态内容结构(动态区域、多态关联等)时,可使用 populate 片段,以更精细地控制联表加载策略。

const entries = await strapi.entityService.findMany('api::article.article', {
  populate: {
    dynamicZone: {
      on: {
        'components.foo': {
          fields: ['title'],
          filters: { title: { $contains: 'strapi' } },
        },
        'components.bar': {
          fields: ['name'],
        },
      },
    },

    morphAuthor: {
      on: {
        'plugin::users-permissions.user': {
          fields: ['username'],
        },
        'api::author.author': {
          fields: ['name'],
        },
      },
    },
  },
});