模型关联
1.定义模型
user表:
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
username: STRING(32),
password: STRING(32),
status: INTEGER, // 启用状态 1为启用 0为关闭
userimg: STRING(200),
created_at: DATE,
updated_at: DATE,
auth_group表(记录用户权限表):
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
title: STRING(50), // 用户title
rules: STRING(500),
status: INTEGER, // 是否启用 0 禁用 1 启用
created_at: DATE,
updated_at: DATE,
auth_group_access表(中间表,连接auth_group与user表):
uid: INTEGER, // user表ID
group_id: INTEGER, // 对应auth_groupID
created_at: DATE,
updated_at: DATE,
auth_rule表(权限表):
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
route: STRING(200), // 路由地址
name: STRING(200), // 接口名称
status: INTEGER, // 启用状态 1为开启 0为关闭
created_at: DATE,
updated_at: DATE,
ismenu: INTEGER, // 是否是菜单 0 不是菜单 1 是菜单
prent_id: INTEGER, // 菜单父级ID
icon: STRING(200), // 菜单图标
show: INTEGER, // 菜单是否展示 1为展示0为隐藏
sort: INTEGER, // 菜单排序
2.一对一关系
// 在USER模型中编写
Model.associate = function() {
app.model.User.hasOne(app.model.AuthGroupAccess, { foreignKey: 'uid'});
// foreignKey的值为AuthGroupAccess表中的外键(对应user表里ID的字段)
}
// controller调用
const result = await app.model.User.findAll({
include: {
model: app.model.AuthGroupAccess,
// include: { // 如果还有关联就内嵌
// model: app.model.xxx,
// }
},
});
以上写法可以通过user找到AuthGroupAccess表里的数据,如果由AuthGroupAccess表来找user表的数据应该这么写:
3.多对多关系
有中间表的实现:
user表的ID对应auth_group_access表中的uid
auth_group表中的id对应auth_group_access表中的group_id
// User 模型中
Model.associate = function() {
app.model.User.belongsToMany(app.model.AuthGroup, { through: app.model.AuthGroupAccess, foreignKey: 'uid' }); // foreignKey的值为:User表的ID与auth_group_access(中间表)对应的字段 名,through为中间表的模型
}
// AuthGroup 模型中
Model.associate = function() {
app.model.AuthGroup.belongsToMany(app.model.User, { through: app.model.AuthGroupAccess, foreignKey: 'group_id' }); // foreignKey的值为:AuthGroup表的ID与auth_group_access(中间表)对应 的字段名,through为中间表的模型
}