本文以RBAC權限管理中的用戶和角色舉例碗誉,兩個實體存在多對多的關系奴璃,一個用戶擁有多個角色,一個角色屬于多個用戶鹤耍。typeorm的中文文檔沒有對自定義中間表的說明肉迫,發(fā)現(xiàn)英文有相關說明,但示例代碼貌似有問題稿黄。
一喊衫、中間表有自定義字段的處理
在用戶user和role實體之外,新建一個roleUse的實體(記錄用戶和角色的關聯(lián)關系)杆怕,如此本來是多對多的關系族购,變成了user和role與roleUser二組一對多的關系,這樣雖然會多定義一個實體陵珍,但好處是可以中間表可以擴展定義其它額外的數(shù)據(jù)
用戶實體 user.entity.ts
import { Entity, Column, Index, ManyToMany, JoinColumn, OneToMany, JoinTable, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';
import { Role } from '../../admin/role/role.entity';
import { UserRole } from '../../admin/role/roleUser.entity';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 100 })
@Index({ unique: true })
name: string;
@OneToMany(type => UserRole, userRole => userRole.user)
userRoles: UserRole[];
}
角色實體role.entity.ts
import { Entity, Column, ManyToMany, OneToMany, JoinTable, JoinColumn } from 'typeorm';
import { BaseEntity } from '../../../common/base/base.entity';
import { UserRole } from './roleUser.entity';
@Entity('role')
export class Role extends BaseEntity {
@Column({ length: 100 })
role_name: string;
@OneToMany(type => UserRole, userRole => userRole.role)
userRoles: UserRole[];
}
中間表實體 roleUser.entity.ts (主健)
import { Entity, PrimaryGeneratedColumn, JoinColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne } from 'typeorm';
import { BaseEntity } from '../../../common/base/base.entity';
import { User } from '../../web/user/user.entity';
import { Role } from './role.entity';
@Entity()
export class UserRole {
@PrimaryGeneratedColumn()
public id: number;
@CreateDateColumn()
created_time: Date;
@UpdateDateColumn()
updated_time: Date;
@ManyToOne(type => User, user => user.userRoles)
@JoinColumn({name: 'user_id'})
user: User;
@ManyToOne(type => Role, role => role.userRoles)
@JoinColumn({name: 'role_id'})
role: Role;
}
中間表定義roleUser.entity.ts(復合主鍵)
import { Entity, PrimaryGeneratedColumn, JoinColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne } from 'typeorm';
import { BaseEntity } from '../../../common/base/base.entity';
import { User } from '../../web/user/user.entity';
import { Role } from './role.entity';
@Entity()
export class UserRole {
@CreateDateColumn()
created_time: Date;
@UpdateDateColumn()
updated_time: Date;
@ManyToOne(type => User, user => user.userRoles, { primary: true })
@JoinColumn({name: 'user_id'})
user: User;
@ManyToOne(type => Role, role => role.userRoles, { primary: true })
@JoinColumn({name: 'role_id'})
role: Role;
}
二挺峡、無中間表的多對多實體定義首繁,又分為單向和雙向,單向是僅在一側與關系裝飾器的關系, 雙向是與關系兩側的裝飾者的關系赡模。具體官網(wǎng)文檔:https://typeorm.io/#/relations,此處主要講雙向
角色實體
import { Entity, Column, ManyToMany, OneToMany, JoinTable, JoinColumn } from 'typeorm';
import { BaseEntity } from '../../../common/base/base.entity';
import { User } from '../../web/user/user.entity';
@Entity('role')
export class Role extends BaseEntity {
@Column({ length: 100 })
role_name: string;
@Column({ length: 100 })
remark: string;
// 無中間實體表的配置
@ManyToMany(type => User, user => user.roles, { cascade: true })
users: User[];
}
用戶實體
import { Entity, Column, Index, ManyToMany, JoinColumn, OneToMany, JoinTable, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';
import { Role } from '../../admin/role/role.entity';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 100 })
@Index({ unique: true })
name: string;
// 無中間實體表的配置
@ManyToMany(type => Role, role => role.users)
@JoinTable({
name: 'user_role',
joinColumns: [
{name: 'user_id'}
],
inverseJoinColumns: [
{name: 'role_id'}
]
})
// 下面的定義也能實現(xiàn)
// @JoinTable({
// name: 'user_role',
// joinColumn: { name: 'user_id' },
// inverseJoinColumn: { name: 'role_id' },
// })
roles: Role[];
}