【问题标题】:How to return the entity with it's relations after saving it?保存后如何返回实体及其关系?
【发布时间】:2021-11-11 04:14:59
【问题描述】:

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

需要单独添加类别,然后在添加产品时,从下拉列表中选择可用类别之一。这又以一对多/多对一的关系将 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
    }
  }
}

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

这是解析器中 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;
    }
  }

我一直在尝试不同的事情,但似乎没有任何效果,我想知道是否甚至可以直接返回实体及其关系。如果不是,我能想到的另一个选择是根据结果返回真/假并重新查询所有数据。但这似乎非常低效,我正在积极尝试避免走这条路。

任何帮助将不胜感激。

【问题讨论】:

    标签: express typeorm typegraphql


    【解决方案1】:

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

    try {
          const { productID } = await Product.create(productInput).save();
    
          return await Product.findOne(productID);
        } catch (error) {
          return error;
        }
    

    这允许我在产品保存在数据库中后根据产品ID直接返回产品,并正确返回对象及其关系。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 2021-03-08
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      相关资源
      最近更新 更多