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 }),
);
},
我的 booking
与 class
和 user
有关系。所以,默认情况下它只是返回 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.category
和 class.type
),它似乎并不适用按照我的预期工作。
在我的数据库中,关系链是这样的:booking
-> class
-> category
/ type
,其中 category
和 type
每个都有一个 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)
我正在使用 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 }),
);
},
我的 booking
与 class
和 user
有关系。所以,默认情况下它只是返回 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.category
和 class.type
),它似乎并不适用按照我的预期工作。
在我的数据库中,关系链是这样的:booking
-> class
-> category
/ type
,其中 category
和 type
每个都有一个 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)