【问题标题】:How to update two entities on one endpoint?如何更新一个端点上的两个实体?
【发布时间】:2020-07-01 16:48:05
【问题描述】:

我必须在我的服务中创建一个函数来更新我在数据库中的数据,但我必须更新两个不同实体中的数据,因为我在 UserEntityDetailsEntity 之间有 @OneToOne 关系,这是我的实体:

用户实体

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

 //more an more...

  @OneToOne(
    () => Details,
    details=> details.user
  )
  details: Details;
}

详细信息实体

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

  @Column()
  userId: number;

  @OneToOne(() => User, {
    nullable: false,
    onUpdate: 'CASCADE',
  })
  @JoinColumn({
    name: 'userId',
  })
  user: User;

//more and more...

}

那么,我怎样才能只在一个服务/控制器中更新这两个实体(带有可选字段)?

我的 dto 是什么样的?

/////////////////////

【问题讨论】:

  • 正在更新哪个资源?你打电话给/user 还是/detail?我知道这些是 OnToOne,但 如何 他们是相关的?用户到细节有什么特别之处?或者它实际上是对用户的详细信息?没有足够的说法应该是什么样子。另外,一个小时前你也有同样的问题。保持原来的问题。否则删除问题并重新提出问题没有任何好处。
  • @JayMcDoniel:我必须使用具有userId 字段的Detail 实体
  • 你必须什么?更新详细信息?是否也需要更新用户?有太多的未知数,我无法理解你想要做什么。
  • 是的,我必须只使用一项服务更新这两个实体,因为我必须只向服务器发送一个响应,该响应必须包含这两个实体的数据
  • 好的,但您还没有理解为什么两者都需要更新?您正在发送Detail,对吗?那么为什么要担心User?您提供的内容没有意义

标签: javascript node.js typescript nestjs typeorm


【解决方案1】:

就像其他评论者之前提到的那样,我不完全确定为什么要这样做,但作为一个从事过无法立即修复的架构问题的项目的人,我会尝试帮忙。

你的问题没有包含太多细节,所以我只是做一些假设:

  • 您有一个端点 /userDetails,您正在响应 PUTPOST HTTP 方法。
  • 带有属性的 JSON 正文,其中一些将转到 User 实体,而另一些将转到 Detail 实体。

我会从正文中获取属性并将它们放入用户和细节实体的对象中。

然后创建一个 typeorm 事务并同时插入/更新两个实体:TypeORM Transactions

一些伪代码:

const {body} = req;
const {
    username, addressLine1, city, state // etc...
} = body;
// User properties
const user = {
    username
};

// Detail properties
const detail = {addressLine1, city, state};

await getManager().transaction(async transactionalEntityManager => {
    await transactionalEntityManager.save(user);
    await transactionalEntityManager.save(detail);
    // ...
});

【讨论】:

    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多