复数如何在 Sequelize 中工作?

Posted

技术标签:

【中文标题】复数如何在 Sequelize 中工作?【英文标题】:How do plurals work in Sequelize? 【发布时间】:2018-03-23 23:29:47 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

如果您没有用于连接表本身的 sequelize 模型,这并不罕见(您让 sequelize 自己发挥多对多的魔力),那么您必须使用复数形式:

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

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

【讨论】:

老实说他们应该没有添加这个,为什么他们要代表用户做出决定表名的名称,这使得他们的库维护复杂 @PirateApp 你好,我现在已经成为维护者,未来我可能会开始一些改变来改变这个默认行为! 我真的对这个单数和复数的东西感到恼火,而且它对于必须在哪里使用它感到困惑。它使整个使用变得繁琐和浪费时间 @ShyamSundarR 您好,很抱歉听到您遇到问题,感谢您让我知道,也许我们可以添加一个选项来完全禁用此功能。但是,理想情况下,我们希望将复数应用于确实有意义的地方,当然我们不希望浪费人们的时间,您能否打开一个问题,显示一个困扰您的最小示例?谢谢! @PedroA,我是一个非常新的人,最近可能大约一周前试图绕过这个包。我基本上是在尝试查看 github 的现有包以获取一些示例代码。我一般都知道一般的 db 原则,并且使用过 mongoose 和 mongo。我的意思是我基​​本上对我们定义模型的地方感到困惑,即迁移 createtable 方法。有多个地方。我也永远无法真正理解何时使用模型 js 文件,它会在内部用于限制迁移到这些模型的数据吗?真的没有兴趣阅读完整的文档

以上是关于复数如何在 Sequelize 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sequelize 基于 sqlite3 中的“日期”列进行查询?

了解 Sequelize 中的关联

sequelize.query() 两次返回相同的结果

如何将查询逻辑添加到基于 graphql-sequelize 的设置?

在 Sequelize 中创建对象字段

使用 Typescript 在 Sequelize 模型中创建实例方法