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

ecfsfe2w  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(129)

我最近开始与strapi合作,并一直在弄清楚如何去内容关系等...现在我已经达到了一个点,当我有多个内容关系相互依赖。
这是我的结构:

收藏类型:

1.产品分类

  • 文章
  • 内容关系:* 文章有一个类别 *
    单一类型:
  • 网站Map
  • 内容关系:* 首页有很多文章 *

现在,我想做的是获取被分配到主页的文章类别的所有嵌套属性,只需从/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控制器文档
有谁知道解决这个问题的办法吗?

30byixjq

30byixjq1#

在Strapi v4中,您可以在请求时检索深度嵌套关系,我必须检索一个嵌套关系category_tags,它与category相关,而它与我试图检索的page集合类型相关。这里是一个链接,了解更多信息https://docs.strapi.io/dev-docs/api/rest/populate-select
例如,这个调用只从
page集合类型中检索categories关系,但是我还需要从categories中检索category_tags*关系。

{{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和封面图像。
您可以更进一步,但响应变慢,最后一次调用是1136 ms和24.95 KB。

esbemjvw

esbemjvw2#

首先,您需要一个自定义的控制器功能。在/api/homepage/controllers/homepage.js中,您可以导出自定义查找函数。
您可以在其中定义要填充的字段:

module.exports = {
 find: ctx => {
   return strapi.query('homepage').find(ctx.query, [
     {
       path: 'displayedArticles',
       populate: {
         path: 'category',
       },
     },
   ]);
 }
};

有关参考,请参阅最新的beta文档:定制化
第二种方式:按照需求填充

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;
  }

};

相关问题