命名策略

默认情况下,Sequelize将使用模型名称(传递给sequelize.define的名称),以便在关联时使用模型名称. 例如,一个名为user的模型会将关联模型的实例中的get / set / add User函数和加入一个名为.user的属性,而一个名为User的模型会添加相同的功能,和一个名为.User的属性(注意大写U).

正如我们已经看到的,你可以使用as来关联模型. 在单个关联(has one 和 belongs to),别名应该是单数,而对于许多关联(has many)它应该是复数. Sequelize然后使用 [inflection][0] 库将别名转换为其单数形式. 但是,这可能并不总是适用于不规则或非英语单词. 在这种情况下,你可以提供复数和单数形式的别名:

  1. User.belongsToMany(Project, { as: { singular: 'task', plural: 'tasks' }})
  2. // Notice that inflection has no problem singularizing tasks, this is just for illustrative purposes.

如果你知道模型将始终在关联中使用相同的别名,则可以在创建模型时提供它

  1. class Project extends Model {}
  2. Project.init(attributes, {
  3. name: {
  4. singular: 'task',
  5. plural: 'tasks',
  6. },
  7. sequelize,
  8. modelName: 'project'
  9. })
  10. User.belongsToMany(Project);

这将为用户实例添加 add/set/get Tasks 方法.

记住,使用as来更改关联的名称也会改变外键的名称. 当使用as时,也可以指定外键是最安全的.

  1. Invoice.belongsTo(Subscription)
  2. Subscription.hasMany(Invoice)

不使用 as,这会按预期添加 subscriptionId. 但是,如果你要发送Invoice.belongsTo(Subscription, { as: 'TheSubscription' }),那么你将同时拥有 subscriptionIdtheSubscriptionId,因为 sequelize 不够聪明,无法确定调用是相同关系的两面. foreignKey 修正了这个问题;

  1. Invoice.belongsTo(Subscription, { as: 'TheSubscription', foreignKey: 'subscription_id' })
  2. Subscription.hasMany(Invoice, { foreignKey: 'subscription_id' })