【发布时间】: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