命名策略

命名策略

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

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

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

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

class Project extends Model {}
Project.init(attributes, {
  name: {
    singular: 'task',
    plural: 'tasks',
  },
  sequelize,
  modelName: 'project'
})

User.belongsToMany(Project);

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

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

Invoice.belongsTo(Subscription)
Subscription.hasMany(Invoice)

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

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