假设我有一个用户和项目。 比我在它们之间创建一个1:m的关联。
const User = sequlize.define("user", {...})
const Project = sequelize.define("project". {...})
User.hasMany(Project, { as: "projects" })
比sequelize创建
addProject
自动的方法。
在其他情况下,我可能需要一个自定义功能。
例如,我可能想检查是否允许此用户接听 该项目。
在其他情况下,我可能还想阻止续集 将这些关联方法添加到我的对象中。
我的问题:
有没有办法创建自定义关联方法, 如果没有,我至少可以定义验证方法吗?
我可以阻止续集添加特定的关联方法吗?
答案 0 :(得分:1)
- 有没有一种创建自定义关联方法的方法,如果不能,我至少可以定义一种验证方法?
据我所知,无法创建自定义关联方法。您可以通过scope
字段实现所有自定义。例如:
models.User.belongsToMany(
models.List,
{
through: {
model: models.UserList,
scope: {
owner: true,
},
},
as: {
singular: 'OwnedList',
plural: 'OwnedLists',
},
});
因此,当我在user.addOwnedList(...)
上调用owner
属性UserList
时,默认情况下将为true
。与1:m关联相同,可以通过scope
设置某些字段。另外,您可以具有不同的关联范围,并按as
字段对其进行划分。
例如:
models.User.belongsToMany(
models.List,
{
through: models.UserList,
as: {
singular: 'List',
plural: 'Lists',
},
});
因此要查找所有List
将使用user.getLists(...)
并与其他用户共享列表将使用“ user2.addList(...)”,因此属性owner
将为{{1 }}。要只获得拥有的列表,将使用false
结果,SQL将类似于defaut的user.getOwnedLists(...)
。
- 我可以防止sequelize添加特定的关联方法吗?
您不能阻止方法的创建,但是可以在关联后立即将其删除。例如:
WHERE "owner"=true
因此,当有人调用方法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;
};
时,将导致user.createList
错误。这不是完美的解决方案,但至少可以在没有复杂约束的情况下增加更多的安全性和数据一致性。