如何在sequelize中自定义关联方法

Arw*_*ett 5 node.js sequelize.js

假设我有一个用户和项目.比我在它们之间创建一个1:m的关联.

const User = sequlize.define("user", {...})
const Project = sequelize.define("project". {...})

User.hasMany(Project, { as: "projects" })
Run Code Online (Sandbox Code Playgroud)

比续集更能创造出来

addProject 
Run Code Online (Sandbox Code Playgroud)

我自动的方法.

在其他情况下,我可能需要一个自定义功能.

例如,我可能想检查是否允许该用户选择项目.

在其他情况下,我可能还希望防止sequelize将这些关联方法添加到我的对象.

我的问题:

  1. 有没有办法创建自定义关联方法,如果没有,我至少可以定义验证方法吗?

  2. 我可以阻止续集添加特定的关联方法吗?

小智 1

  1. 有没有办法创建自定义关联方法,如果没有,我至少可以定义一个验证方法吗?

据我所知,无法创建自定义关联方法。您可以通过现场实现所有定制scope。例如:

  models.User.belongsToMany(
    models.List,
    {
      through: {
        model: models.UserList,
        scope: {
          owner: true,
        },
      },
      as: {
        singular: 'OwnedList',
        plural: 'OwnedLists',
      },
    });
Run Code Online (Sandbox Code Playgroud)

所以当我调用属性user.addOwnedList(...)时将默认为。1:m 关联也是如此,有些字段可以通过 来设置。您还可以有不同的关联范围并按字段划分它们。例如:ownerUserListtruescopeas

  models.User.belongsToMany(
    models.List,
    {
      through: models.UserList,
      as: {
        singular: 'List',
        plural: 'Lists',
      },
    });
Run Code Online (Sandbox Code Playgroud)

因此,要查找所有List将使用的列表user.getLists(...)并与其他用户共享列表将使用“user2.addList(...)”,因此属性owner将是false。为了仅获取拥有的列表,将使用user.getOwnedLists(...)结果 SQL,默认情况下会如此WHERE "owner"=true

  1. 我可以阻止sequelize添加特定的关联方法吗?

您无法阻止方法的创建,但可以在关联后立即将其删除。例如:

user.associate = function (models) {
  models.User.belongsToMany(
    models.List,
    {
      through: models.UserList,
      as: {
        singular: 'List',
        plural: 'Lists',
      },
    });

  models.User.belongsToMany(
    models.List,
    {
      through: {
        model: models.UserList,
        scope: {
          owner: true,
        },
      },
      as: {
        singular: 'OwnedList',
        plural: 'OwnedLists',
      },
    });

  /**
   * Deleting method createList to prevent list creation
   * without owner
   * List must be created using user.createOwnedList
   */
  delete user.prototype.createList;
};
Run Code Online (Sandbox Code Playgroud)

所以当有人调用方法时user.createList会导致undefined is not a function错误。这不是完美的解决方案,但至少它增加了更多的安全性和数据一致性,而没有复杂的约束。