我有2个以下具有多对多关系的实体 *用户实体(用户实体拥有的关系)
import { Entity, Column, PrimaryGeneratedColumn, UpdateDateColumn, ManyToMany, JoinTable, CreateDateColumn } from 'typeorm';
import { Role } from './role.schema';
@Entity('Users')
export class User {
@PrimaryGeneratedColumn({ name: 'Id' })
id: number;
@Column({
name: 'Email',
length: 100,
unique: true
})
email: string;
@Column({
name: 'FirstName',
length: 30
})
firstName: string;
@Column({
name: 'LastName',
length: 30
})
lastName: string;
@ManyToMany(type => Role, { eager: true })
@JoinTable({
name: 'UserRoles',
joinColumns: [
{ name: 'UserId' }
],
inverseJoinColumns: [
{ name: 'RoleId' }
]
})
roles: Role[];
}
*角色实体(具有两个现有角色:管理员和用户)
import { Entity, Column, PrimaryGeneratedColumn, ManyToMany } from 'typeorm';
import { User } from './user.schema';
@Entity("Roles")
export class Role {
@PrimaryGeneratedColumn({ name: 'Id' })
id: number;
@Column({
name: 'Name',
length: 50,
unique: true
})
name: string;
@ManyToMany(type => User, user => user.roles)
users: User[];
}
应用程序的设计使得角色名称以数组的形式在请求中发送,例如['管理员','用户']
现在插入用户时,
目前我首先根据请求中收到的角色名称数组从数据库中检索Role对象(指定所需的角色),
然后将其分配给User对象(roles属性)和
然后最后调用User对象上的save方法将记录插入User表中。
片段:
createConnection(connectionConfig as ConnectionOptions).then(async connect => {
let userRepo = connect.getRepository(User);
let roleRepo = connect.getRepository(Role);
let roles = ['Admin', 'User'];
let user = userRepo.create();
return roleRepo.createQueryBuilder('role').where('role.name IN (:roleNames)', {roleNames : roles}).getMany().then((roles) => {
user.email = 'test1@test.test';
user.firstName = 'TestFName';
user.lastName = 'TestLName';
user.roles = roles;
return userRepo.save(user)
})
}).catch(error => {
console.log(error);
});
这导致许多数据库调用。如果有人可以用更聪明,更优雅的方式启发我(使用流畅的QueryBuilder来实现上述结果),那将是很棒的。