7

我有 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[];
}

应用程序的设计使得角色名称以数组的形式在请求中发送,例如 ['Admin', '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 来实现上述结果)

4

0 回答 0