在 Strapi v4 中自定义填充的最佳方式是什么?

问题描述 投票:0回答:1

本质上我想要完成的是:

默认情况下,如果没有传递“includes”查询参数,我只想将模型中的所有内容填充到下一层,以包含所有组件、关系等。我知道使用“populate: star”可以轻松完成此操作。但是,如果在包含中传递字段/对象/数组,我仍然希望将所有内容填充到下一级(即“填充:星号”),但最重要的是,我想包含在包含中传递的任何内容也仅查询参数。这对我来说不起作用,因为第二次填充总是覆盖“填充:'*'”。彻底查看 Strapi 文档后,我没有看到任何方法可以结合这两种场景,那么完成这样的事情以动态处理多级深度填充但仅针对指定关系的最佳方法是什么?

strapi populate
1个回答
0
投票

如果我正确理解你的问题,这就是我的答案。

Strapi 提供了一种使用查询参数自定义查询的灵活方法,您可以通过根据查询参数动态构建查询来实现您所描述的行为。具体来说,您可以使用 JavaScript 代码根据“includes”查询参数的存在有条件地构建查询。

以下是如何实现这一目标的总体概述:

解析查询参数以检查“includes”参数是否存在。

如果“includes”参数不存在,请使用“populate: '*'”执行默认查询以获取下一级的所有内容。

如果存在“includes”参数,则构建一个将“populate: '*'”与基于“includes”参数的附加填充相结合的查询。

以下是如何在 Strapi 控制器中实现此功能的示例:

async find(ctx) {
  const { includes } = ctx.query;

  // Define the default query with "populate: '*'"
  let query = strapi.query('yourContentType').find();

  // Check if the "includes" parameter is present
  if (includes) {
    // Parse the "includes" parameter to get an array of fields/relations to include
    const includeFields = includes.split(',');

    // Dynamically add populates based on the "includes" parameter
    includeFields.forEach((field) => {
      query = query.populate({
        path: field,
        populate: '*',
      });
    });
  }

  // Execute the query
  const result = await query;

  // Return the result
  ctx.send(result);
}

在此示例中:

我们首先检查查询中是否存在“includes”参数。

如果不存在,我们将使用包含“populate: '*'”的默认查询来获取下一级的所有内容。

如果存在“includes”参数,我们将其拆分为要包含的字段/关系数组。

然后,我们使用循环为“includes”参数中的每个字段/关系动态添加填充。

最后,我们执行查询并返回结果。

此方法允许您处理两种情况:默认情况下获取下一级的所有内容,并根据提供的“includes”参数动态添加其他填充。

如果我已向您提供了预期的解释,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.