1

I'm using loopback 4 and loopback cli version is 2.2.1 and I'm using MongoDB connector as my data-source, When I try to filter data using API explorer I'm unable to fetch order details , hasMany relation is not working as expected but in order query i can able to get customer detail.

query used :

/customers?filter={"include":[{"relation":"orders"}]}

Customer Model

import {Entity, model, property, hasMany} from '@loopback/repository';
import {Order} from './order.model';

@model()
export class Customer extends Entity {
  @property({
    type: 'string',
    id: true,
    generated: true,
  })
  id?: string;

  @property({
    type: 'string',
    required: true,
  })
  name: string;

  @hasMany(() => Order)
  orders: Order[];

  constructor(data?: Partial<Customer>) {
    super(data);
  }
}

export interface CustomerRelations {
  // describe navigational properties here
}

export type CustomerWithRelations = Customer & CustomerRelations;

Order Model

import {Entity, model, property, belongsTo} from '@loopback/repository';
import {Customer} from './customer.model';

@model()
export class Order extends Entity {
  @property({
    type: 'string',
    id: true,
    generated: true,
  })
  id?: string;

  @property({
    type: 'string',
    required: true,
  })
  name: string;

  @belongsTo(() => Customer)
  customerId: string;

  constructor(data?: Partial<Order>) {
    super(data);
  }
}

export interface OrderRelations {
  // describe navigational properties here
}

export type OrderWithRelations = Order & OrderRelations;

Customer Repository

import {Getter, inject} from '@loopback/core';
import {DefaultCrudRepository, HasManyRepositoryFactory, repository} from '@loopback/repository';
import {MongoDataSource} from '../datasources/mongo.datasource';
import {Customer, CustomerRelations} from '../models/customer.model';
import {Order} from '../models/order.model';
import {OrderRepository} from './order.repository';

export class CustomerRepository extends DefaultCrudRepository<
  Customer,
  typeof Customer.prototype.id,
  CustomerRelations
  > {

  public readonly orders: HasManyRepositoryFactory<Order, typeof Customer.prototype.id>;

  constructor(
    @inject('datasources.mongo') dataSource: MongoDataSource, @repository.getter('OrderRepository') protected orderRepositoryGetter: Getter<OrderRepository>,
  ) {
    super(Customer, dataSource);
    this.orders = this.createHasManyRepositoryFactoryFor('orders', orderRepositoryGetter,);
    this.registerInclusionResolver('orders', this.orders.inclusionResolver);
  }
}

Order Repository

import {Getter, inject} from '@loopback/core';
import {BelongsToAccessor, DefaultCrudRepository, repository} from '@loopback/repository';
import {MongoDataSource} from '../datasources/mongo.datasource';
import {Customer} from '../models/customer.model';
import {Order, OrderRelations} from '../models/order.model';
import {CustomerRepository} from './customer.repository';

export class OrderRepository extends DefaultCrudRepository<
  Order,
  typeof Order.prototype.id,
  OrderRelations
  > {

  public readonly customer: BelongsToAccessor<Customer, typeof Order.prototype.id>;

  constructor(
    @inject('datasources.mongo') dataSource: MongoDataSource, @repository.getter('CustomerRepository') protected customerRepositoryGetter: Getter<CustomerRepository>,
  ) {
    super(Order, dataSource);
    this.customer = this.createBelongsToAccessorFor('customer', customerRepositoryGetter,);
    this.registerInclusionResolver('customer', this.customer.inclusionResolver);
  }
}

Response

[
  {
    "id": "5eeda8af3e951001e81af9e3",
    "name": "sam"
  },
  {
    "id": "5eedbd790230752568fa5921",
    "name": "joel"
  }
]
Rifa Achrinza
  • 1,555
  • 9
  • 19
  • Unfortunately this isn't enough info to pinpoint the issue. Please provide the following: The respective repositories & complete model definitions. – Rifa Achrinza Jun 20 '20 at 11:52

1 Answers1

1

This may be caused by a quirk in how LoopBack Juggler handles MongoDB ObjectIDs.

Hence, it is recommended to do the following:

  1. Add settings.strictObjectIDCoercion: true on all models for model-level ID coercion:
@model({
  settings: {
    strictObjectIDCoercion: true,
  },
})
  1. Add dataType: 'ObjectId' to the foreign key:
@belongsTo(() => Customer,
{},
{
  mongodb: {dataType: 'ObjectId'}
})
customerId: string
Rifa Achrinza
  • 1,555
  • 9
  • 19