-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Labels
RelationsModel relations (has many, etc.)Model relations (has many, etc.)
Description
Note
This issue was spun off from a Slack discussion and StackOverflow question:
I have four models- purchase, purchase products, vendors, and product.
The purchase has many purchase products and vice versa
purchase products belong to product and vice versa
Vendors has many purchase and vice vera
Now with the following code, I am getting all purchases, purchase-products, and vendors(with field filter) but not able to use fields filter with the product model.
Is it a bug or I am doing it wrong way
async find(
): Promise<Purchase[]> {
return this.purchaseRepository.find(
{
include: [{
relation: 'purchaseProducts',
scope: {
fields: { name: false, product_id: false}, // not working
include: [{ relation: 'products' }],
}
}, {
relation: 'vendors',
scope: {
fields: { address_line1: false, city: false, state: false, pincode: false, gst_number: false, // working }
}
}]
}
);
}
And for relation vendors fields name : true is not working, so I have to fields name : false.
Thank you in advance
purchase.model.ts
import { Entity, model, property, hasMany, belongsTo } from '@loopback/repository';
import { PurchaseProduct } from './purchase-product.model';
import { Vendor } from './vendor.model';
@model({ settings: { strict: true } })
export class Purchase extends Entity {
@property({
type: 'string',
id: true,
})
purchase_id: string;
@property({
type: 'date',
})
date?: string;
@property({
type: 'number',
required: true,
})
totalprice?: number;
@hasMany(() => PurchaseProduct, { keyTo: 'purchase_id' })
purchaseProducts: PurchaseProduct[];
@belongsTo(() => Vendor, { name: 'vendors' })
vendor_id: number;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Purchase>) {
super(data);
}
}
export interface PurchaseRelations {
// describe navigational properties here
}
export type PurchaseWithRelations = Purchase & PurchaseRelations;
purchase-products.model.ts
import { Entity, model, property, belongsTo } from '@loopback/repository';
import { Purchase } from './purchase.model';
import { Product } from './product.model';
@model({ settings: { strict: true } })
export class PurchaseProduct extends Entity {
@property({
type: 'number',
id: true,
generated: true,
})
id?: number;
@property({
type: 'number',
required: true,
})
quantity: number;
@property({
type: 'number',
required: true,
})
price: number;
@belongsTo(() => Purchase, { name: 'purchases' })
purchase_id: string;
@belongsTo(() => Product, { name: 'products' })
product_id: number;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<PurchaseProduct>) {
super(data);
}
}
export interface PurchaseProductRelations {
// describe navigational properties here
}
export type PurchaseProductWithRelations = PurchaseProduct & PurchaseProductRelations;
product.model.ts
import { Entity, model, property, hasMany, hasOne, belongsTo } from '@loopback/repository';
import { Purchase } from './purchase.model';
import { OrderedProducts } from './ordered-products.model';
import {PurchaseProduct} from './purchase-product.model';
@model({ settings: { strict: true } })
export class Product extends Entity {
@property({
type: 'number',
id: true,
generated: true,
})
product_id?: number;
@property({
type: 'string',
required: true,
index: {
unique: true
}
})
name: string;
@property({
type: 'string',
required: true,
})
image_url: string;
@property({
type: 'string',
})
description?: string;
@hasMany(() => OrderedProducts, { keyTo: 'product_id' })
orderedProducts: OrderedProducts[];
@hasOne(() => ProductPrice, { keyTo: 'product_id' })
productPrices: ProductPrice;
@hasMany(() => PurchaseProduct, {keyTo: 'product_id'})
purchaseProducts: PurchaseProduct[];
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Product>) {
super(data);
}
}
export interface ProductRelations {
// describe navigational properties here
}
export type ProductWithRelations = Product & ProductRelations;
vendor.model.ts
import { Entity, model, property, hasMany } from '@loopback/repository';
import { Purchase } from './purchase.model';
@model({ settings: { strict: true } })
export class Vendor extends Entity {
@property({
type: 'number',
id: true,
generated: true,
})
vendor_id?: number;
@property({
type: 'string',
required: true,
})
name: string;
@property({
type: 'string',
required: true,
index: {
unique: true
}
})
mobile_no: string;
@property({
type: 'string',
index: {
unique: true
}
})
email?: string;
@hasMany(() => Purchase, { keyTo: 'vendor_id' })
purchases: Purchase[];
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Vendor>) {
super(data);
}
}
export interface VendorRelations {
// describe navigational properties here
}
export type VendorWithRelations = Vendor & VendorRelations;
dougal83
Metadata
Metadata
Assignees
Labels
RelationsModel relations (has many, etc.)Model relations (has many, etc.)