Feathers.js / Sequelize -> 具有两个模型之间关系的服务

2023-12-25

我已经通过sequelize 使feeas.js 与mysql 一起工作。这是可行的,我可以从表中收集数据。下一步是在模型中定义“连接”。

我有一个包含“status_id”和“country_id”列的表。这些列引用元数据表中的 ID。在 SQL 中我会是对的:

SELECT status.description, country.description, detail 
FROM details 
INNER JOIN metadata status 
    ON (details.status_id = status.id AND status.type = 'status' 
INNER JOIN metadata country 
    ON (details.country_id =country.id AND country.type = 'country')

在这种情况下,该元数据表不会很大,因此采用了这种方法。它确实提供了我需要的灵活性。

我需要做什么才能在 Feathters.js 中实现此目的?


在帮助很多人解决同样的问题后,我了解到解决方案分为两部分:

#1 - 拥抱 ORM
人们的大部分问题都来自于对sequelize缺乏了解。为了帮助您,您首先需要了解如何续集关联 http://docs.sequelizejs.com/en/latest/docs/associations/工作以及如何使用执行查询“包含”选项 http://docs.sequelizejs.com/manual/tutorial/models-usage.html#eager-loading(又名“渴望加载”)。我建议您将这些链接的所有内容阅读几次,然后再阅读一次以达到更好的效果;这是续集学习曲线中最陡峭的部分。如果您从未使用过 ORM,请让它为您完成许多繁重的工作!

#2 - 从羽毛钩子设置续集选项
一旦您了解了“include”选项如何与sequ​​elize配合使用,您将需要从fees中的“before”钩子中设置该选项。羽毛将传递价值hook.params.sequelize作为选项参数 https://docs.feathersjs.com/api/databases/sequelize.html#paramssequelize对于所有的sequelize方法调用。你的钩子可能是这样的:

// GET /my-service?name=John&include=1
function (hook) {
   if (hook.params.query.include) {
      const AssociatedModel = hook.app.services.fooservice.Model;
      hook.params.sequelize = {
         include: [{ model: AssociatedModel }]
      };
      // delete any special query params so they are not used
      // in the WHERE clause in the db query.
      delete hook.params.query.include;
   }
   return Promise.resolve(hook);
}

在引擎盖下,羽毛会召唤您的模特find方法有点像这样:

// YourModel is a sequelize model
const options = Object.assign({ where: { name: 'John' }}, hook.params.sequelize);
YourModel.findAndCount(options);

值得注意的是:
旧的 v1.x 羽毛生成器(2017 年 3 月之前)不会生成对续集友好的代码。这已在新的 v2.x 生成器中得到修复。如果您在 2017 年 3 月之前就已深入开展项目,那么do not使用新的发电机。请加入松弛通道 http://slack.feathersjs.com/并加入sequelize寻求帮助的空间。我会关注那里的情况并可以帮助你。如果您刚刚开始您的项目并且还没有取得很大进展,那么我强烈建议您使用新的生成器重新开始。运行此命令(并按照这些说明 https://github.com/feathersjs/cli):

$ feathers --version              # see what version you are using
$ npm install -g @feathersjs/cli    # install latest version of the CLI
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Feathers.js / Sequelize -> 具有两个模型之间关系的服务 的相关文章

随机推荐