繁体   English   中英

复数在Sequelize中如何工作?

[英]How do plurals work in Sequelize?

在使用Sequelize并阅读Sequelize文档时 ,我观察到模型名称有时以单数形式使用,有时以复数形式使用。 通过关联自动添加到模型中的某些方法具有单数形式,而某些具有复数形式。

1. Sequelize如何计算复数? 它是否只是在字符串后附加“ s”?

2.如果我想使用不规则复数形式的名词,例如“ Person”,该怎么办?

3.定义实例时,应使用单数还是复数形式?

4.定义别名时,应使用单数还是复数形式?

5.在定义多对多关系时,我应该在through选项中使用单数还是复数形式?

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"
    }
});

定义别名时

在为hasOnebelongsTo关联定义别名时,必须使用单数形式:

Foo.belongsTo(Bar, { as: "person" });

hasManybelongsToMany关联定义别名时,必须使用复数形式:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM