如何在manyToOne关系中插入数据? NestJs

时间:2020-07-06 13:44:40

标签: javascript orm nestjs

我是ORM系统的新手,我正在尝试插入与对象“ pseudo”绑定的数据“ Mark”。

这是我的实体, 伪:

@Entity()
export class PseudoEntity{
    @PrimaryGeneratedColumn()
    id: number;

    @Column({unique: true})
    pseudo: string;

    @Column({ default: 1 })
    application_version: number;

    @Column({ default: -1 })
    score_on_last_calculation: number;

    @Column({default: 1})
    nb_request: number;

    @Column({default: -1})
    nb_mark_on_last_calculation: number;
    
    @OneToMany(type => Mark, marks => marks)
    marks: Mark[];
}

然后标记:

@Entity()
export class MarkEntity {

  @PrimaryGeneratedColumn()
  int: number;

  @Column({ type: 'datetime'})
  submission_date: Date;

  @Column()
  mark: number;

  @ManyToOne(
    type => Pseudo,
    pseudo => pseudo,
  )
  pseudo: Pseudo;
}

这是我插入数据的服务:

@Injectable()
export class MarkService {
  constructor(private pseudoService: PseudoService) {}

  async postMark(pseudo: string, mark: number) {
    await this.pseudoService.findPseudo(pseudo).then(
      p =>
         getConnection()
          .createQueryBuilder()
          .insert()
          .into(Mark)
          .values([
            {
              mark: mark,
              pseudo: p,
            },
          ]),
    );
  }
}

我成功插入了一个Pseudo而不是一个标记:/

能帮我吗?

预先感谢

2 个答案:

答案 0 :(得分:1)

首先,您应该对实体进行一些细微更改:

@OneToMany(type => Mark, marks => marks.pseudo)
marks: Mark[];

@ManyToOne(
  type => Pseudo,
  pseudo => pseudo.marks,
)
pseudo: Pseudo;

进行了上述更改,使用注入的pseudoRepository来查询和更新所需的Pseudo :(有关Registering and Injecting entities的更多信息)

@Injectable()
export class MarkService {
    constructor(@InjectRepository(Pseudo) private readonly pseudoRepository: Repository<Pseudo>) { }

    async postMark(mark: number, pseudo: Pseudo): Promise<void> {
    
        let _mark = new Mark();

        mark.mark = mark;

        mark.pseudo = await pseudoRepository.findOne({ pseudo });

        await this.pseudoRepository.save(_mark)
    }
}

答案 1 :(得分:0)

我没有尝试过,但是我想这应该起作用:

import { Injectable } from '@nestjs/common';
import { PseudoEntity as Pseudo } from '../entity/pseudo.entity';
import { MarkEntity as Mark } from '../entity/mark.entity';
import { getConnection } from 'typeorm';

@Injectable()
export class PseudoService {
 async postMark(markInput: number, pseudoInput: string) {
    let mark = new Mark();
    mark.mark = markInput;
    mark.submission_date = Date.now();
    mark.pseudo = await await repository.findOne({ pseudo: pseudoInput});
    await getConnection().manager
            .save(mark)
            .then(mark => {
                console.log("Mark has been saved. Mark id is ", mark.id);
            });
  }

  //....

}

您可能应该添加检查,以防在数据库中找不到此pseudoInput的伪内容。