Sequelize 如何计算复数形式
在后台,sequelize 使用了一个名为 inflection 的出色库来计算单数和复数形式的单词,它几乎适用于任何英语单词,包括不规则复数形式,例如 "Person" -> "People"、"Octopus" -> "Octopi"、"Tooth" -> "Teeth"。不过,有些词的变形会出错,对于这些情况,或者您想强制使用自定义单/复数词的情况,请参阅下一个主题。
如果我想用不规则复数形式的名词怎么办?
如上所述,大多数不规则复数的单词都会通过屈折正确复数(包括“Person”)。但是有一些词的变化是错误的。 Sequelize 允许您
强制使用您希望的单数和复数形式,通常接受带有 { singular: "your-singular-here", plural: "your-plural-here" } 形式的普通对象来代替名称字符串。有关详细信息,请参阅下一个主题。
定义实例时
定义实例时,标准的方式是使用单数名称,但你也可以使用复数名称,因为 sequelize 会对其应用变形方法来获得单数和复数形式
随时需要:
const Foo = sequelize.define("foo", {
// attributes
});
如果要强制自定义单复数形式,请使用第三个参数指定名称选项:
const Foo = sequelize.define("foo", {
// attributes
}, {
name: {
singular: "mycustomsingularstring",
plural: "mycustompluralstring"
}
});
定义别名时
为hasOne 或belongsTo 关联定义别名时,必须使用单数形式:
Foo.belongsTo(Bar, { as: "person" });
为hasMany 或belongsToMany 关联定义别名时,必须使用复数形式:
Foo.belongsToMany(Bar, { through: Foo_Bar, as: "people" });
或者,如果您想强制自定义单/复数字符串:
Foo.belongsToMany(Bar, {
through: Foo_Bar,
as: {
singular: "mycustomsingularstring",
plural: "mycustompluralstring"
}
});
定义多对多关系时
如果您有连接表本身的 sequelize 模型,最佳做法是在 through 选项中使用模型本身:
// If you have this somewhere
const Foo_Bar = sequelize.define("foo_bar", {
// attributes
});
// Then the best practice is to pass the model itself
Foo.belongsToMany(Bar, { through: Foo_Bar });
如果您没有用于连接表本身的 sequelize 模型,这并不罕见(您让 sequelize 自己发挥多对多的魔力),那么您必须使用复数形式:
Foo.belongsToMany(Bar, { through: "foo_bars" });
顺便说一句,你可能已经注意到我的示例中的所有模型定义都是小写的,这是为了遵循 PostgreSQL 的约定(如果你在 PostgreSQL 中的表中有大写字母,你可能会遇到问题),但是如果您不使用 PostgreSQL,您可能可以在模型名称中使用大写字符。