TypeORM:插入与另一个实体有多对多关系的实体(基于现有记录)

时间:2018-01-16 20:30:33

标签: typeorm

我有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来实现上述结果),那将是很棒的。

0 个答案:

没有答案