保存包含另一个实体的实体时出现问题

问题描述 投票:0回答:1

我是 NestJsTypeOrm 的新手。

我的数据库是Mysql2.

这是 planOrder.entity

// planOrder.entity
import { Media } from 'src/media/media.entity';
import { Entity,  PrimaryGeneratedColumn, ManyToOne, OneToOne, CreateDateColumn, UpdateDateColumn } from 'typeorm';
import { Plan } from './plan.entity';
import { Transaction } from 'src/transaction/entities/transaction.entity';

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

  @ManyToOne(() => Media, (media) => media.id)
  media: Media;

  @ManyToOne(() => Plan, (plan) => plan.id)
  plan: Plan

  @OneToOne(() => Transaction, (transaction) => transaction.id)
  transaction: Transaction

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

当我想像这样创建新的计划订单时:

// planOrderService.ts

  async create(body: CreatePlanOrderDto, userId: number) {

// creating transaction is done successfully

    const transaction = await this.transactionService.create({
      amount: body.amount,
      description: body.description,
      paymentDate: body.paymentDate,
      refrenceNumber: body.refrenceNumber,
      userId
    })
    const planOrder = this.planOrderRepository.create()

    planOrder.transaction = transaction  // if I remove this line it would be saved without any errors


    try {

// error happens here
      this.planOrderRepository.save(planOrder)

    } catch (error) {
      console.log('e', error)
    }

  }

首先我创建一个交易。

然后我将该交易添加到 orderPlan 实体

然后我保存它。

但无法保存

我收到一个错误

/home/morteza/Desktop/simple-vedica-back/src/query-builder/UpdateQueryBuilder.ts:681 抛出新的 UpdateValuesMissingError() ^ UpdateValuesMissingError:无法执行更新查询,因为未定义更新值。调用“qb.set(...)”方法 指定更新的值。 在 UpdateQueryBuilder.createUpdateExpression (/home/morteza/Desktop/simple-vedica-back/src/query-builder/UpdateQueryBuilder.ts:681:19) 在 UpdateQueryBuilder.getQuery (/home/morteza/Desktop/simple-vedica-back/src/query-builder/UpdateQueryBuilder.ts:53:21) 在 UpdateQueryBuilder.getQueryAndParameters (/home/morteza/Desktop/simple-vedica-back/src/query-builder/QueryBuilder.ts:495:28) 在 UpdateQueryBuilder.execute (/home/morteza/Desktop/simple-vedica-back/src/query-builder/UpdateQueryBuilder.ts:142:50) 在 updateSubject (/home/morteza/Desktop/simple-vedica-back/src/persistence/SubjectExecutor.ts:618:63) 在Array.map() 在SubjectExecutor.executeUpdateOperations (/home/morteza/Desktop/simple-vedica-back/src/persistence/SubjectExecutor.ts:670:34) 在SubjectExecutor.execute(/home/morteza/Desktop/simple-vedica-back/src/persistence/SubjectExecutor.ts:148:20) 在 processTicksAndRejections (节点:内部/进程/task_queues:95:5) 在 EntityPersistExecutor.execute (/home/morteza/Desktop/simple-vedica-back/src/persistence/EntityPersistExecutor.ts:182:21)

typescript nestjs typeorm mysql2
1个回答
0
投票

我相信在其中一张表上使用@OneToOne时您需要@JoinColumn,请参阅此处

'...我们还添加了@JoinColumn,这是必需的,并且只能在关系的一侧设置。 ...'

'... @JoinColumn 必须仅在关系的一侧设置 - 数据库表中必须具有外键的一侧。 ...'

就这样

  @OneToOne(() => Transaction, (transaction) => transaction.id)
  @JoinColumn()
  transaction: Transaction
  

请参阅此答案了解更多详情

© www.soinside.com 2019 - 2024. All rights reserved.