复数如何在Sequelize中发挥作用?

时间:2018-03-23 23:29:48

标签: javascript sequelize.js

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

1。 Sequelize如何计算复数?它只是附加了一个" s"到字符串?

2. 如果我想使用带有不规则复数的名词怎么办,例如" Person"?

3。在定义实例时,我应该使用单数还是复数形式?

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

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

1 个答案:

答案 0 :(得分:4)

Sequelize如何计算复数

在幕后,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,您可能可以在模型名称中使用大写字符。