我正在使用Strapi CMS并努力获取嵌套/深层内容的数据。 例如:假设我在下面创建了内容类型,并定义了关联。
人员:姓名,年龄
地址:城市,国家/地区
联系方式:代码,电话号码
人有一个地址
地址有很多联系人
现在的问题是,当我访问“ / persons”时,我仅获得“姓名”,“年龄”和“地址”对象。但是地址对象没有与该地址关联的联系信息。
有人可以帮助我解决这个问题,或指向任何此类文章吗?
答案 0 :(得分:4)
首先,您需要一个自定义控制器功能。
在/api/person/controllers/Person.js
中,您可以导出自定义查找功能。您可以在此处定义要填充的字段:
module.exports = {
find: async (ctx) => {
return strapi.query('person').find(ctx.query, ['address', 'contact']);
},
};
另一种解决方案也适用于我:
module.exports = {
find: async (ctx) => {
return strapi.query('person').find(ctx.query, [
{ path: 'address' },
{ path: 'contact' },
]);
},
};
编辑的示例具有更深一层的填充:
module.exports = {
find: async (ctx) => {
return strapi.query('person').find(ctx.query, [
{
path: 'address',
populate: {
path: 'contacts',
},
},
]);
},
};
作为参考,请参阅最新的beta文档:
https://strapi.io/documentation/3.0.0-beta.x/concepts/queries.html#api-reference
答案 1 :(得分:1)
我能够使用以下方法获取一些嵌套数据:
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 }),
);
},
我的booking
与class
和user
有关系。因此,默认情况下,它只是返回了类id
的-但我希望能够看到class
关系中的字段都在同一有效负载中。
即,代替此:
user: "123eqwey12ybdsb233",
class: "743egwem67ybdsb311"
我正在尝试获取:
user: {
id: "123eqwey12ybdsb233",
email: "foo@bar.com",
...
},
class: {
id: "743egwem67ybdsb311",
capacity: 10,
type: {
name: "Individual",
description: "..."
...
}
...
}
现在,以上内容适用于非关系字段..但是对于作为关系的关系的字段(即class.category
和class.type
),它似乎不适合我会期望的。
在我的数据库中,关系链如下:booking
-> class
-> category
/ type
,其中category
和{{1 }}每个都有一个type
和一些其他字段。
答案 2 :(得分:0)
不幸的是,上述答案都不适合我。 我有一个深度嵌套的关系,甚至没有在响应中显示(有些人确实得到了 ID,但我在响应中什么也没得到)。
唯一帮助我的是根据本期的建议构建控制器here
答案 3 :(得分:0)
只有这个对我有用
const data = await strapi
.query("grand_collection")
.model.find({ user: id })
.populate({ path: "parent_collection", populate: { path: "child_collection" } });