Populating with the Query Engine API
The content of this page has not been updated to Strapi v5 yet.
The Entity Service API is the recommended API to interact with your application's database. Only use QueryEngine if EntityService does not cover your use case.
Relations and components have a unified API for populating them.
To populate all the root level relations, use populate: true
:
strapi.db.query('api::article.article').findMany({
populate: true,
});
Select which data to populate by passing an array of attribute names:
strapi.db.query('api::article.article').findMany({
populate: ['componentA', 'relationA'],
});
An object can be passed for more advanced usage:
strapi.db.query('api::article.article').findMany({
populate: {
componentB: true,
dynamiczoneA: true,
relation: someLogic || true,
},
});
Complex populating can also be achieved by applying where
filters and select or populate nested relations:
strapi.db.query('api::article.article').findMany({
populate: {
relationA: {
where: {
name: {
$contains: 'Strapi',
},
},
},
repeatableComponent: {
select: ['someAttributeName'],
orderBy: ['someAttributeName'],
populate: {
componentRelationA: true,
},
},
dynamiczoneA: true,
},
});
When dealing with polymorphic data structures (dynamic zones, polymorphic relations, etc...), it is possible to use populate fragments to have a better granularity on the populate strategy.
strapi.db.query('api::article.article').findMany('api::article.article', {
populate: {
dynamicZone: {
on: {
'components.foo': {
select: ['title'],
where: { title: { $contains: 'strapi' } },
},
'components.bar': {
select: ['name'],
},
},
},
morphAuthor: {
on: {
'plugin::users-permissions.user': {
select: ['username'],
},
'api::author.author': {
select: ['name'],
},
},
},
},
});