Strapi CMS: Fetch Nested Content
Firstly you'll need a custom controller function for this.
In /api/person/controllers/Person.js
you can export your custom find function. There you can define which fields you want to populate:
module.exports = {
find: ctx => {
return strapi.query('person').find(ctx.query, ['address', 'contact']);
},
};
Another solution works for me as well:
module.exports = {
find: ctx => {
return strapi.query('person').find(ctx.query, [
{ path: 'address' },
{ path: 'contact' },
]);
},
};
Edited example with one level deeper populate:
module.exports = {
find: ctx => {
return strapi.query('person').find(ctx.query, [
{
path: 'address',
populate: {
path: 'contacts',
},
},
]);
},
};
For reference see the most recent beta docs:
https://strapi.io/documentation/3.0.0-beta.x/concepts/queries.html#api-reference
I was able to get some nested data using the following:
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 }),
);
},
where my booking
has a relation to class
and user
. So, by default it just comes back with the class id
's - but I'd like to be able to see fields from the class
relation all in the same payload.
ie, instead of this:
user: "123eqwey12ybdsb233",
class: "743egwem67ybdsb311"
I'm trying to get:
user: {
id: "123eqwey12ybdsb233",
email: "[email protected]",
...
},
class: {
id: "743egwem67ybdsb311",
capacity: 10,
type: {
name: "Individual",
description: "..."
...
}
...
}
Now, the above works for non-relational fields.. but for fields that are a relation of a relation (ie. class.category
and class.type
), it doesn't seem to work as I would've expected.
In my database, the relation chain is like so: booking
-> class
-> category
/ type
, where category
and type
each have a name
and some other fields.
Only this worked for me
const data = await strapi
.query("grand_collection")
.model.find({ user: id })
.populate({ path: "parent_collection", populate: { path: "child_collection" } });