[英]How do plurals work in Sequelize?
在使用Sequelize并阅读Sequelize文档时 ,我观察到模型名称有时以单数形式使用,有时以复数形式使用。 通过关联自动添加到模型中的某些方法具有单数形式,而某些具有复数形式。
1. Sequelize如何计算复数? 它是否只是在字符串后附加“ s”?
2.如果我想使用不规则复数形式的名词,例如“ Person”,该怎么办?
3.定义实例时,应使用单数还是复数形式?
4.定义别名时,应使用单数还是复数形式?
5.在定义多对多关系时,我应该在through
选项中使用单数还是复数形式?
在引擎盖下,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 });
如果您没有联结表本身的续集模型,这很常见(您要让续集本身做多对多魔术),那么必须使用复数形式:
Foo.belongsToMany(Bar, { through: "foo_bars" });
顺便说一句,您可能已经注意到我的示例中的所有模型定义都是小写的,这是遵循PostgreSQL的约定的(如果您在PostgreSQL的表中有大写字母,则可能会有问题),但是如果您不使用在PostgreSQL中,您可以在模型名称中使用大写字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.