保存后如何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 对象与其关系。
我正在构建一个存储应用程序,以 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 对象与其关系。