在使用Sequelize和阅读the Sequelize docs时,我观察到有时模型名称以单数形式使用,有时以复数形式使用。通过关联自动添加到模型的一些方法具有单数形式,而一些具有复数形式。
1。 Sequelize如何计算复数?它只是附加了一个" s"到字符串?
2. 如果我想使用带有不规则复数的名词怎么办,例如" Person"?
3。在定义实例时,我应该使用单数还是复数形式?
4. 在定义别名时,我应该使用单数还是复数形式?
5. 在定义多对多关系时,我应该在through
选项中使用单数还是复数形式?
答案 0 :(得分:4)
在幕后,sequelize使用一个名为inflection的精彩库来计算单数和复数形式的单词,几乎适用于任何英语单词,包括"Person" -> "People"
,{{1}等不规则复数形式。 },"Octopus" -> "Octopi"
。有几个词虽然变形出错了,对于那些情况,或者你想强制自定义单数/复数单词的情况,请参阅下一个主题。
如上所述,大多数具有不规则复数的单词将通过拐点正确地复数(包括" Person")。但是有一些词语表明拐点是错误的。 Sequelize允许你
强制你想要的单数和复数形式,通常接受一个"Tooth" -> "Teeth"
形式的普通对象来代替名字串。有关详细信息,请参阅下一主题。
定义实例时,标准方法是使用单数名称,但也可以使用复数名称,因为sequelize将在其上应用变形方法以获得单数和复数形式 需要的时候:
{ singular: "your-singular-here", plural: "your-plural-here" }
如果要强制使用自定义单数和复数形式,请使用第三个参数指定名称选项:
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"
}
});
选项中使用模型本身:
through
如果你没有连接表本身的续集模型,这并不罕见(你让sequelize自己做多对多的魔法),那么你必须使用复数形式:< / p>
// 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 });
顺便提一下,您可能已经注意到我的示例中的所有模型定义都是小写的,这是遵循PostgreSQL的约定(如果PostgreSQL中的表中有大写字母,则可能会出现问题),但是如果您不使用PostgreSQL,您可能可以在模型名称中使用大写字符。