【发布时间】:2022-03-01 00:11:45
【问题描述】:
我正在使用 sequelize-typescript 并尝试在获取用户时不将“通过”模型 (UserRole) 包含在多对多关联中。
当我得到一个用户时,JSON 看起来像这样:
{
"id": 1,
"email": "",
"password": "",
"isVerified": true,
"verificationToken": "",
"passwordResetToken": null,
"createdAt": "2022-02-17T03:04:34.099Z",
"updatedAt": "2022-02-17T03:05:20.754Z",
"roles": [
{
"name": "SUPERADMIN",
"UserRole": {
"userId": 1,
"roleId": 2,
"createdAt": "2022-02-17T03:05:32.474Z",
"updatedAt": "2022-02-17T03:05:32.474Z"
}
}
]
}
理想情况下,“roles”数组中的“UserRole”属性不会存在。或者,至少,我可以将名称从“UserRole”更改为“userRole”并删除“userId”和“roleId”属性。
我尝试在关联上指定“as”属性,为每个模型创建默认范围,但均无济于事。这个人sequelize-typescript many-to-many relationship model data with 也有类似的问题,但关心的是 HasMany 关系,我正在查看 BelongsToMany 关系。我的模型文件如下所示:
user.model.ts
import {
Table,
Column,
Model,
DataType,
HasMany,
BelongsToMany,
DefaultScope,
} from "sequelize-typescript";
import { RefreshToken } from "./refreshToken.model";
import { Role } from "./role.model";
import { UserRole } from "./userRole";
@DefaultScope(() => ({
include: [{ model: Role, attributes: ["name"], include: [] }],
}))
@Table({ tableName: "user", underscored: true })
class User extends Model {
@Column(DataType.STRING)
email!: string;
@Column(DataType.STRING)
password!: string;
@Column(DataType.BOOLEAN)
isVerified!: boolean;
@Column(DataType.STRING)
verificationToken!: string;
@Column(DataType.STRING)
passwordResetToken!: string;
@HasMany(() => RefreshToken, {
onDelete: "CASCADE",
})
refreshTokens!: RefreshToken[];
@BelongsToMany(() => Role, {
through: { model: () => UserRole },
})
roles!: Role[];
@HasMany(() => UserRole, {
onDelete: "CASCADE",
})
userRoles!: UserRole[];
}
export { User };
角色.model.ts
import {
Table,
Column,
Model,
DataType,
HasMany,
BelongsToMany,
} from "sequelize-typescript";
import { User } from "./user.model";
import { UserRole } from "./userRole";
@Table({ tableName: "role", underscored: true, timestamps: false })
class Role extends Model {
@Column(DataType.STRING)
name!: "ADMIN" | "SUPERADMIN";
@BelongsToMany(() => User, {
through: { model: () => UserRole },
})
users!: User[];
@HasMany(() => UserRole, {
onDelete: "CASCADE",
})
userRoles!: UserRole[];
}
export { Role };
userRole.model.ts
import {
Table,
Model,
ForeignKey,
BelongsTo,
PrimaryKey,
Column,
} from "sequelize-typescript";
import { Role } from "./role.model";
import { User } from "./user.model";
@Table({ tableName: "user_role", underscored: true })
class UserRole extends Model {
@BelongsTo(() => User)
user!: User;
@ForeignKey(() => User)
@PrimaryKey
@Column
userId!: number;
@BelongsTo(() => Role)
role!: Role;
@ForeignKey(() => Role)
@PrimaryKey
@Column
roleId!: number;
}
export { UserRole };
【问题讨论】:
-
如果您在用户模型中使用 defaultScope,而不是
include: [],请尝试使用through: { attributes: [] }。这是从表 (UserRole) 中删除任何属性作为响应。
标签: node.js typescript postgresql sequelize.js sequelize-typescript