保存后如何return实体及其关系?

How to return the entity with it's relations after saving it?

我正在构建一个存储应用程序,以 GraphQL 作为后端,使用 Typegraphql 和 TypeORM。

类别需要单独添加,然后在添加产品时,您可以从可用类别的下拉列表中选择一个。这又以 one-to-many/many-to-one 关系将 categoryId 传递给产品。

这是我的类别实体:

import {
  Entity,
  PrimaryColumn,
  Column,
  BaseEntity,
  Generated,
  OneToMany
} from 'typeorm';
import Product from './Product';

@ObjectType()
@Entity('categories')
export default class Category extends BaseEntity {
  @Field()
  @PrimaryColumn()
  @Generated('uuid')
  categoryId: string;

  @Field()
  @Column()
  categoryName: string;

  @OneToMany(() => Product, (product: Product) => product.category)
  products: Product[];
}

这是我的产品实体

import {
  Entity,
  PrimaryColumn,
  Column,
  BaseEntity,
  Generated,
  ManyToOne,
  JoinColumn
} from 'typeorm';
import Category from './Category';

@ObjectType()
@Entity('products')
export default class Product extends BaseEntity {
  @Field()
  @PrimaryColumn()
  @Generated('uuid')
  productID: string;

  @Field()
  @Column()
  productName: string;

  @Field(() => Category)
  @ManyToOne(() => Category, (category: Category) => category.products, {
    cascade: true,
    lazy: true
  })
  @JoinColumn()
  category: Category;

  @Field()
  @Column()
  productQuantity: number;

  @Field()
  @Column({ type: 'decimal', precision: 2 })
  productPrice: number;

  @Field()
  @Column({ type: 'decimal', precision: 2 })
  productPriceRA: number;

  @Field()
  @Column({ type: 'decimal', precision: 2 })
  productPriceKK: number;

  @Field()
  @Column('varchar', { length: 255 })
  productSupplier: string;

  @Field()
  @Column('varchar', { length: 255 })
  productOrderLink: string;

  @Field()
  @Column('longtext')
  productImage: string;
}

对于保存突变,我也创建了一个输入类型:

export default class ProductInput implements Partial<Product> {
    @Field()
    productName: string;

    @Field(() => String)
    category: Category;

    @Field()
    productQuantity: number;

    @Field()
    productPrice: number;

    @Field()
    productPriceRA: number;

    @Field()
    productPriceKK: number;

    @Field()
    productSupplier: string;

    @Field()
    productOrderLink: string;

    @Field()
    productImage: string;
}

关系有效,因为我可以通过以下查询查询产品及其类别数据:

{
  getProducts {
    productID
    productName
    category {
       categoryId
       categoryName
    }
  }
}

但是,保存产品时总是 returns "message": "Cannot return null for non-nullable field Category.categoryName."

这是 Resolver 中的 Mutation 代码:

@Mutation(() => Product, { description: 'Add new product' })
  async addProduct(
    @Arg('product') productInput: ProductInput
  ): Promise<Product | any> {
    try {
      const product = await Product.create(productInput).save();

      console.log('product: ', product);
      return product;
    } catch (error) {
      return error;
    }
  }

我一直在尝试不同的方法,但似乎没有任何效果,我想知道是否有可能直接 return 实体及其关系。如果不是,我能想到的另一种选择是根据结果 return true/false 并重新查询所有数据。但这似乎效率很低,我正在积极尝试避免走这条路。

任何帮助将不胜感激。

经过更多研究,我决定采用以下方法:

try {
      const { productID } = await Product.create(productInput).save();

      return await Product.findOne(productID);
    } catch (error) {
      return error;
    }

这让我可以直接 return 产品,在产品保存在数据库中后,基于产品 ID 并正确 return 对象与其关系。