Strapi:获取深度嵌套关系中所有嵌套属性

6
我最近开始使用strapi,并一直在研究如何处理内容关系等问题... 现在我已经到达了一个点,其中有多个相互依赖的内容关系。
这是我的结构:
Collection Types:
1.分类 2.文章 -含有内容关系:文章有一个分类 Single Types:
1.首页 -含有内容关系:首页有多篇文章 现在我想做的是,通过从/homepage进行简单的GET请求,获取分配给首页的文章的所有嵌套属性的类别。
我当前获得的json结构是这样的:
{
   "id": 1,
   "hero": {
    ....
   },
   "featuredArticles": {
    ....
   },
   "displayedArticles": [
      {
         "id": 2,
         "category": 5,
      }
   ]
}

预期输出是什么:

{
   "id": 1,
   "hero": {
    ....
   },
   "featuredArticles": {
    ....
   },
   "displayedArticles": [
      {
         "id": 2,
         "category": [
            {
              "id": 5,
              "title": "Foundation"
            }
         ],
      }
   ]
}

我的怀疑是,当尝试从/homepage而不是直接从/articles获取时,类别的属性基本上太嵌套了。
我发现可以通过修改strapi目录中的控制器来处理这个问题,但我还没有完全弄清楚。 Strapi控制器文档 这里有人知道解决方法吗?
2个回答

2
在Strapi v4中,您可以在请求时检索深度嵌套的关系。我需要检索与我尝试检索的页面集合类型相关的与类别相关的嵌套关系类别标签。这里有一个链接供您了解更多信息https://docs.strapi.io/dev-docs/api/rest/populate-select

举个例子,这个调用只从页面集合类型中检索了类别关系,但我还需要从类别中检索类别标签关系。

{{dev_url}}/api/pages?populate=*

这个调用将在检索页面集合类型时,从categories中检索嵌套关系category_tags

{{dev_url}}/api/pages?populate[categories][populate][0]=category_tags

此外,我还需要从category_tags中检索另一个关系feature并返回一张图片,所以现在我需要获取三层深度的数据。
{{dev_url}}/api/pages?populate[categories][populate][category_tags][populate][feature][populate][0]=category_tag,cover

这部分具体来说[0]=category_tag,cover是从特征中检索category_tag和封面图像。

0
首先,您需要为此编写一个自定义控制器函数。在/api/homepage/controllers/homepage.js中,您可以导出自定义的查找函数。
在那里,您可以定义要填充的字段:
module.exports = {
 find: ctx => {
   return strapi.query('homepage').find(ctx.query, [
     {
       path: 'displayedArticles',
       populate: {
         path: 'category',
       },
     },
   ]);
 }
};

请参考最新的测试文档: 自定义

第二种方法:根据需求填充它。

module.exports = {
  find: async (ctx) => {
    const homePage = await strapi.query('homepage').find(ctx.query);
    const categories = await strapi.query('categories').find();

    if (homePage[0].displayedArticles) {
       homePage[0].displayedArticles.forEach(async (content) => {
         if(categories){
           content.category = categories.find((category) => {
             return category.id === content.category;
           });
         }
      });
    } 
    
    if (homePage[0].displayedComponents) {
      homePage[0].displayedComponents.forEach(async (content) => {
        if(categories){
         content.category = categories.find((category) => {
           return category.id === content.category;
          });
        }
      });
    } 
    
    return homePage;
  }

};

这对我产生的影响是显著减少了/homepage的响应。它不会填充类别,也不会显示默认响应中的数据。 - Adam Schwarcz
我只得到了原始响应数据的大约40%。 "displayedArticles"根本没有显示。 - Adam Schwarcz
@AdamSchwarcz 我已经用另一种方式编辑了我的答案。请测试一下。 - Anuj Divkar
通常我在文章中发现的是,当有人需要帮助进行填充时,他们会得到一个响应 category: {...}(未填充的对象清楚地表明有东西需要填充),但我的问题是,由于某种原因,该类别仅显示 category: 5(仅显示ID,没有其他内容,并且不显示未填充的对象)。这是一个深度嵌套的关系 - 主页有许多文章,而每篇文章只有一个类别 = 这些类别是从文章中提取的,而不是从主页本身提取的。 - Adam Schwarcz
const categories = await strapi.services['category'].find(); 我之前使用过categories。请检查并测试。 - Anuj Divkar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接