Strapi CMS:获取嵌套内容

Strapi CMS: Fetch Nested Content

我正在使用 Strapi CMS 并努力获取 nested/deep 内容的数据。 例如:比方说,我创建了以下内容类型并定义了关系。

人物:姓名、年龄

地址:城市,国家

联系人:代码,号码

一个人有一个地址

地址有多个联系人

现在的问题是,当我访问“/persons”时,我只得到姓名、年龄和地址对象。但是地址对象没有与地址关联的联系信息。

有人可以帮助我解决这个问题或指出任何此类文章吗?

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

module.exports = {
  find: ctx => {
    return strapi.query('person').find(ctx.query, ['address', 'contact']);
  },
};

另一个解决方案也适用于我:

module.exports = {
  find: ctx => {
    return strapi.query('person').find(ctx.query, [
       { path: 'address' },
       { path: 'contact' },
    ]);
  },
};

填充更深一层的编辑示例:

module.exports = {
  find: ctx => {
    return strapi.query('person').find(ctx.query, [
      {
        path: 'address',
        populate: {
          path: 'contacts',
        },
      },
    ]);
  },
};

有关参考,请参阅最新的测试版文档:

https://strapi.io/documentation/3.0.0-beta.x/concepts/queries.html#api-reference

我能够使用以下方法获得 一些 嵌套数据:

api/booking/controllers/booking.js:

async find(ctx) {
    const entities = await strapi.services.booking.find(ctx.query, [
        'class',
        'class.capacity',
        'class.date',
        'class.category',
        'class.category.name',
        'class.type',
        'class.type.name',
        'class.startTime',
        'class.endTime',
      ]);
    }

    return entities.map((entity) =>
      sanitizeEntity(entity, { model: strapi.models.booking }),
    );
  },

我的 bookingclassuser 有关系。所以,默认情况下它只是返回 class id's - 但我希望能够在相同的有效负载中看到来自 class 关系的字段。

即,而不是这个:

user: "123eqwey12ybdsb233",
class: "743egwem67ybdsb311"

我正在尝试获取:

user: {
  id: "123eqwey12ybdsb233",
  email: "foo@bar.com",
  ...
},
class: {
  id: "743egwem67ybdsb311",
  capacity: 10,
  type: {
    name: "Individual",
    description: "..."
    ...
  }
  ...
}

现在,上面的方法适用于 non-relational 字段。但是对于关系的关系字段(即 class.categoryclass.type),它似乎并不适用按照我的预期工作。

在我的数据库中,关系链是这样的:booking -> class -> category / type,其中 categorytype 每个都有一个 name 和一些其他字段。

不幸的是,上述答案中的

None 对我有用。 我有一个深层嵌套的关系,甚至没有在响应中显示(有些人确实获得了 ID,但我在响应中什么也没有)。

唯一对我有帮助的是根据本期中的建议构建控制器 here

只有这个对我有用

const data = await strapi
  .query("grand_collection")
  .model.find({ user: id })
  .populate({ path: "parent_collection", populate: { path: "child_collection" } });

这个对我有用

let populate = ["parentCollection", "parentCollection.fieldToBePopulated"]
return await strapi.services.grandParentCollection.find({ condition }, populate)