【问题标题】:Creating related entity after Insertion Typeorm插入Typeorm后创建相关实体
【发布时间】:2021-01-13 04:19:56
【问题描述】:

我有 2 个实体:

  1. 用户
  2. 促销

我想创建一个促销实体, 每次创建/插入用户实体时,它与用户实体具有 oneToOne 关系。

我是 typeorm 的新手,所以我不确定实现这一目标的最佳方法是什么。

我尝试使用订阅者似乎无法实现所需的功能。 另一种选择是在 GraphQL Resolver 中执行此操作,但这对我来说似乎很乱。

在尝试执行此操作时,什么被认为是最佳做法?

【问题讨论】:

    标签: graphql typeorm


    【解决方案1】:

    您可以完全使用 typeorm 来保存所有必需的数据,但请确保您创建的实体之间具有正确的连接:

    // 促销.ts

    @Index()
    @OneToOne(() => User, user => user.promo)
    @JoinColumn()
    user: User
    

    我已将@JoinColumn 添加到 Promo 中,期待 Promo 实体在表中包含 userId。

    // 用户.ts

    @OneToOne(() => Promo, promo => promo.user)
    promo: Promo
    

    例如,在 Repository 中,您可以使用 Transaction 操作并保存用户,并在保存此用户后立即使用其他所需的促销详细信息:

    saveUser(user: User) {
      return getManager().transaction(async (manager) => {
        const result = await manager
          .getRepository(User)
          .createQueryBuilder()
          .insert()
          .values(user)
          .execute()
        
        // check on result emptiness
    
        const createdUser = await manager
          .getRepository(User)
          .createQueryBuilder()
          .where('id=:id',{id: result.identifiers[0].id})
          .getOne()
    
        await manager
          .getRepository(Promo)
          .createQueryBuilder()
          .insert()
          .values({user: createdUser})
          .execute()
      })
    }
    

    它将在第一个用户和与该用户的促销之后保存在一个交易中。

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多