命名策略
默认情况下,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' })