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

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

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

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

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

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

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

【问题讨论】:

    标签: javascript sequelize.js


    【解决方案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 文件,它会在内部用于限制迁移到这些模型的数据吗?真的没有兴趣阅读完整的文档
    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2021-01-08
    • 2014-03-23
    • 2018-09-23
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多