我正在使用sequelize-typescript库的sequelize,我正在尝试实现以下关系:
Team.ts
@Scopes({
withPlayers: {
include: [{model: () => User}]
}
})
@Table
export default class Team extends Model<Team> {
@AllowNull(false)
@Column
name: string;
@BelongsToMany(() => User, () => TeamPlayer)
players: User[];
}
User.ts
@Scopes({
withTeams: {
include: [{model: () => Team, include: [ () => User ]}]
}
})
@Table
export default class User extends Model<User> {
@AllowNull(false)
@Column
firstName: string;
@AllowNull(false)
@Column
lastName: string;
@BelongsToMany(() => Team, () => TeamPlayer)
teams: Team[];
}
TeamPlayer.ts
@DefaultScope({
include: [() => Team, () => User],
attributes: ['number']
})
@Table
export default class TeamPlayer extends Model<TeamPlayer> {
@ForeignKey(() => User)
@Column
userId: number;
@ForeignKey(() => Team)
@Column
teamId: number;
@Unique
@Column
number: number;
}
现在,当查询播放器时,您将获得具有以下数据的对象:
{
"id": 1,
"name": "Doe's Team",
"players": [
{
"id": 1,
"firstName": "John",
"lastName": "Doe",
"TeamPlayer": {
"userId": 1,
"teamId": 1,
"number": 32
}
}]
}
现在有几件我无法完成的事情......
1)我想将 TeamPlayer
重命名为"membership";但不是通过更改类的名称2) TeamPlayer
的内容不应该有id`s,但我希望它包含团队的数据,例如:
{
"firstName": "John",
"lastName": "Doe"
"membership": {
"number": 32
}
在上面的类中,我尝试将范围设置为 TeamPlayer
类,仅在 TeamMember
包含内包含 number
,但没有效果 .
我曾经让 TeamPlayer
类具有 team
和 player
的直接成员资格,但该解决方案为 TeamPlayer
类添加了多余的 id
,并且也没有阻止团队中的重复成员资格 . 我确实可以在这些情况下手动(=代码中)防止重复,但这并不优雅 .
1 回答
我最终通过添加从
TeamPlayer
到User
和Team
的一对多关系来解决这个问题,并且通过添加两个@ForeignKey
字段来找出使teamId
userId
对唯一的方法,如下所示:TeamPlayer.ts
User.ts
Team.ts
此解决方案允许我通过范围控制包含的查询属性,并为我提供适当的对象输出 .