Strapi CMS:获取嵌套内容

时间:2019-11-28 09:37:05

标签: strapi

我正在使用Strapi CMS并努力获取嵌套/深层内容的数据。 例如:假设我在下面创建了内容类型,并定义了关联。

人员:姓名,年龄

地址:城市,国家/地区

联系方式:代码,电话号码

人有一个地址

地址有很多联系人

现在的问题是,当我访问“ / persons”时,我仅获得“姓名”,“年龄”和“地址”对象。但是地址对象没有与该地址关联的联系信息。

有人可以帮助我解决这个问题,或指向任何此类文章吗?

4 个答案:

答案 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 }),
    );
  },

我的bookingclassuser有关系。因此,默认情况下,它只是返回了类id的-但我希望能够看到class关系中的字段都在同一有效负载中。

即,代替此:

user: "123eqwey12ybdsb233",
class: "743egwem67ybdsb311"

我正在尝试获取:

user: {
  id: "123eqwey12ybdsb233",
  email: "foo@bar.com",
  ...
},
class: {
  id: "743egwem67ybdsb311",
  capacity: 10,
  type: {
    name: "Individual",
    description: "..."
    ...
  }
  ...
}

现在,以上内容适用于非关系字段..但是对于作为关系的关系的字段(即class.categoryclass.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" } });