HasOne
Below is how you can define a HasOne relationship.
@Definition()
export class Product {
@Id()
id: ObjectId;
@Property()
name: string;
@HasOne(() => FeatureImage, {
to: 'productId',
allowCreateWithin: true,
})
featureImage: Ref<FeatureImage>;
}
@Definition()
export class FeatureImage {
@Id()
id: ObjectId;
@Property()
url: string;
@Property({ type: () => GraphQLObjectId })
productId: ObjectId;
@BelongsTo(() => Product, { from: 'productId' })
product: Product;
}Ref is a type function imported from 'dryerjs', not using Ref will result in a ReferenceError
In the above example, we have defined a HasOne relationship between Product and FeatureImage. This means that a Product can have one FeatureImage.
Because of that we have to define a storeId property on the FeatureImage class. This is the foreign key that will be used to identify which Product a FeatureImage belongs to.
Create API
mutation {
createProduct(input: {
name: "Awsome Product",
featureImage: { url: "https://dryerjs.com/logo.png" }
}) {
id
name
featureImage {
id
url
}
}
}If you want to prevent the creation of a featureImage along with a product,
you can set allowCreateWithin to false in the options or simply omit it.
Resolve fields
To prevent the resolution of the featureImage field, set noPopulation to true.
@Definition()
export class Product {
@HasOne(() => FeatureImage, {
to: 'productId',
noPopulation: true,
})
featureImage: Ref<FeatureImage>;
}Ensure relationship
By default, you cannot remove a Product if it has a FeatureImage. To allow removal in this case, you can set skipRelationCheckOnRemove to true in the options.