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" } });

Tags:

Strapi