TypeORM ManyToMany Juntion table 创建不工作

TypeORM ManyToMany Juntion table create not working

我有两个表 servicesoffers。一个优惠可以有很多服务,一个服务可以有很多优惠。

我的服务实体

@Entity('Services')
export class ServiceEntity extends BaseEntity {
 
  @PrimaryGeneratedColumn()
  serviceKey: number;
  
  ....
  
  @ManyToMany(() => OffersEntity, (offer) => offer.services)
  @JoinTable({
    name: 'offersXservices',
    inverseJoinColumn: {
        name: 'offerKey',
        referencedColumnName: 'offerKey'
    },
    joinColumn: {
        name: 'serviceKey',
        referencedColumnName: 'serviceKey',
    },
   })
   offers?: OffersEntity[];

}

我的优惠实体定义如下:

@Entity('Offers')
export class OffersEntity extends BaseEntity {
  @PrimaryGeneratedColumn()
  offerKey: number;
  
  ....
  
  @ManyToMany(() => ServiceEntity, (service) => service.offers)
  @JoinTable({
    name: 'offersXservices',
    inverseJoinColumn: {
        name: 'serviceKey',
        referencedColumnName: 'serviceKey'
    },
    joinColumn: {
        name: 'offerKey',
        referencedColumnName: 'offerKey',
    },
   })
   services?: ServiceEntity[];
}

当我尝试使用某些服务创建报价记录时出现错误:query failed: INSERT INTO "offersXservices"("offerKey", "serviceKey") VALUES (DEFAULT, DEFAULT), (DEFAULT, DEFAULT) error: error: null value in column "offerKey" violates not-null constraint

我不明白为什么会这样?在上面生成的查询中,DEFAULT 应该分别替换为 offerKey 和 serviceKey。谁能帮我解决这个问题?

这是我用来插入报价记录的代码。

const _offerEntity = await OffersEntity.create({
            vendorKey: input.vendorKey,
            name: input.name,
            description: input.description,
            startAt: input.startAt,
            expiry: input.expiry,
            services: await ServiceEntity.find({
                where: {
                    serviceKey: In(input.services)
                }
            })
        });

 await queryRunner.manager.save(_offerEntity);

任何帮助将不胜感激:)

PS: 数据库是postgresql

这个问题我没有找到合适的答案。我最终使用带有 typeorm 的原始 sql 查询。

for (const _service of input.services) {
   await queryRunner.manager.query(`INSERT INTO "offersXservices"("offerKey", "serviceKey") VALUES (${_offerEntity.offerKey}, ${_service})`);
}

希望对大家有所帮助。