javascript - 复数在 Sequelize 中如何工作?

标签 javascript sequelize.js

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

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

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

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

4.定义别名时,用单数还是复数?

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

最佳答案

Sequelize 如何计算复数

在幕后,sequelize 使用了一个很棒的库,叫做 inflection计算单词的单数和复数形式,它几乎适用于任何英语单词,包括不规则的复数形式,例如 "Person"-> "People""Octopus"-> "Octopi"“ dentry ”->“ dentry ”。不过,有几个词的变形会出错,对于那些情况,或者您想要强制使用自定义单数/复数词的情况,请参阅下一个主题。


如果我想使用不规则复数形式的名词怎么办?

如上所述,大多数具有不规则复数的单词将通过变形正确复数(包括“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 });

如果您没有联结表本身的 sequelize 模型,这并不罕见(您让 sequelize 自己完成多对多的魔法),那么您必须使用复数形式:

Foo.belongsToMany(Bar, { through: "foo_bars" });

顺便说一下,您可能已经注意到我示例中的所有模型定义都是小写的,这是为了遵循 PostgreSQL 的约定(如果您在 PostgreSQL 的表中有大写字母,您可能会遇到问题),但是如果您不使用 PostgreSQL,则可以在模型名称中使用大写字符。

关于javascript - 复数在 Sequelize 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459596/

相关文章:

javascript - Sequelize 获取重复条目 : 'ER_DUP_ENTRY'

javascript - coupon.getItemTypes() 不是属于ToMany 的函数

node.js - 错误找不到模块 'sequelize'

javascript - 如何在 JQuery 中按日期对 xml 数据进行排序

javascript - Hook Canvas 的 toDataURL

javascript - 搜索 javascript 对象或对象数组最有效

javascript - 如何在 Cloud Functions for Firebase 上使用 Express 执行 HTTP 文件上传(multer、busboy)

mysql - 如何控制台记录 promise Sequelize 的返回值

node.js - React Context API、大数组和应用速度

javascript - jQuery 星级评定插件无法识别 {split :4}