Връзката Loopback hasMany не връща данни

Използвам loopback 4 и loopback cli версията е 2.2.1 и използвам MongoDB конектор като мой източник на данни. Когато се опитвам да филтрирам данни с помощта на API Explorer, не мога да извлека подробности за поръчката, връзката hasMany не работи както се очаква, но при заявка за поръчка мога да получа подробности за клиента.

използвана заявка:

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

Модел на клиента

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;

Модел на поръчката

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;

Клиентско хранилище

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);
  }
}

Хранилище за поръчки

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);
  }
}

Отговор

[
  {
    "id": "5eeda8af3e951001e81af9e3",
    "name": "sam"
  },
  {
    "id": "5eedbd790230752568fa5921",
    "name": "joel"
  }
]

person Lakshmi Narasimhan    schedule 20.06.2020    source източник
comment
За съжаление това не е достатъчно информация, за да се определи проблема. Моля, предоставете следното: съответните хранилища и пълни дефиниции на модела.   -  person Rifa Achrinza    schedule 20.06.2020


Отговори (1)


Това може да е причинено от странност в как LoopBack Juggler обработва MongoDB ObjectIDs.

Следователно се препоръчва да направите следното:

  1. Добавяне на settings.strictObjectIDCoercion: true към всички модели за принудително ИД на ниво модел:
@model({
  settings: {
    strictObjectIDCoercion: true,
  },
})
  1. Добавете dataType: 'ObjectId' към външния ключ:
@belongsTo(() => Customer,
{},
{
  mongodb: {dataType: 'ObjectId'}
})
customerId: string
person Rifa Achrinza    schedule 22.06.2020