【问题标题】:How insert data in manyToOne relationship ? NestJs如何在 manyToOne 关系中插入数据?巢穴
【发布时间】:2020-10-26 15:48:26
【问题描述】:

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

这是我的实体, 伪:

@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,
            },
          ]),
    );
  }
}

我成功插入了伪而不是标记:/

你能帮帮我吗?

提前致谢

【问题讨论】:

    标签: javascript orm nestjs


    【解决方案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)
        }
    }
    

    【讨论】:

    • 感谢您的帮助 :) 在最后一行代码中,您的意思是 markRepository.save(mark) 吗?
    • 我是否必须在我的模块中导入某些内容才能使用 @InjectRepository ?因为我有这个错误。 Nest can't resolve dependencies of the MarkService (?, MarkEntityRepository, PseudoService). Please make sure that the argument PseudoEntityRepository at index [0] is available in the PseudoModule context.
    • 是的,请在我的帖子中附加的链接中阅读更多相关信息
    【解决方案2】:

    我没有尝试过,但我想这应该可行:

    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);
                });
      }
    
      //....
    
    }
    

    您可能应该添加一个检查,以防在数据库中找不到此伪输入的伪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-20
      • 2020-06-10
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2021-07-24
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多