Loopback 4 включает вложенные отношения

Недавно команда loopback добавила поддержку включения вложенных отношений. Ссылка https://loopback.io/doc/en/lb4/HasMany-relation.html#query-multiple-relations. Но он не покрывает остальной URL-адрес API, чтобы получить вложенные отношения. Это то, что я пробовал.

http://[::1]:3000/users?filter[include][0][Relations]=carts&filter[include][0][scope]filter[include][0][Relations]

У меня есть три модели пользователей, тележек, продуктов. У пользователей есть много тележек, а тележки принадлежат продукту. Моя версия loopback / cli - 1.27.0

user.repository.ts

constructor(
    @inject('datasources.farm') dataSource: FarmDataSource,  @repository.getter('CartRepository') protected cartRepositoryGetter: Getter<CartRepository>,
  ) {
    super(Users, dataSource);
    this.carts = this.createHasManyRepositoryFactoryFor('carts', cartRepositoryGetter,);
    this.registerInclusionResolver('carts', this.carts.inclusionResolver);

  }

cart.repository.ts

 constructor(
    @inject('datasources.farm') dataSource: FarmDataSource, @repository.getter('UsersRepository') protected usersRepositoryGetter: Getter<UsersRepository>, @repository.getter('ProductRepository') protected productRepositoryGetter: Getter<ProductRepository>,
  ) {
    super(Cart, dataSource);
    this.product = this.createBelongsToAccessorFor('product_id', productRepositoryGetter);
    this.registerInclusionResolver('product', this.product.inclusionResolver);

    this.users = this.createBelongsToAccessorFor('user_id', usersRepositoryGetter);
    this.registerInclusionResolver('users', this.users.inclusionResolver);
  }
}

product.repository.ts

constructor(
    @inject('datasources.farm') dataSource: FarmDataSource, @repository.getter('PurchaseRepository') protected purchaseRepositoryGetter: Getter<PurchaseRepository>, @repository.getter('StockRepository') protected stockRepositoryGetter: Getter<StockRepository>, ) {
    super(Product, dataSource);


    this.registerInclusionResolver('stocks', this.stocks.inclusionResolver);
    this.registerInclusionResolver('purchases', this.purchases.inclusionResolver);

  }

заранее спасибо


person pratik jaiswal    schedule 21.12.2019    source источник


Ответы (1)


Я успешно реализовал отношения с MySQL в качестве источника данных. В документации говорится, что использование нереляционных баз данных приведет к неожиданному поведению. Если это ваш случай, то вам следует проверить их прогресс. Открытая проблема петлевых отношений

Нашими примерами моделей будут Вопрос (Источник) и Ответ (Цель). Вопрос имеет отношение hasMany к ответу

Настройте свои модели для обработки отношения, по одному за раз

  • Вы должны добавить новое свойство в свою модель вопроса с помощью декоратора @hasMany, которое будет выглядеть примерно так

    @hasMany (() => Ответ, {keyTo: 'question_id', name: 'answers'}) ответы ?: Response []

  • Обратите внимание, что keyTo - это внешний ключ, который позволит отношению работать, а name - это просто имя отношения.

  • В вашей модели вопроса добавьте свойство внешнего ключа, если вы еще не определили его. Это можно сделать с помощью обычного декоратора @property () ИЛИ следующим образом

    @belongsTo (() => Вопрос, {name: 'question', keyTo: 'question_id'}) question_id ?: number;

В репозитории исходной модели (вопрос) вам необходимо предоставить доступ к целевой модели (ответ), как показано ниже:

export class QuestionRepository extends DefaultCrudRepository<
  Question,
  typeof Question.prototype.question_id,
  QuestionRelations
  > {
  public readonly responses: HasManyRepositoryFactory<
    Response,
    typeof Question.prototype.question_id
  >;
  constructor (
    @inject('datasources.myDB') dataSource: MyDBDataSource,
    @repository.getter('ResponseRepository') responseRepository: Getter<ResponseRepository>,
  ) {
    super(Question, dataSource);
    this.responses = this.createHasManyRepositoryFactoryFor(
      'responses',
      responseRepository
    );
    this.registerInclusionResolver('responses', this.responses.inclusionResolver);
  }
}
  • Убедитесь, что вы добавили последнюю строку, в которой регистрируется преобразователь включения.

Теперь ваши отношения должны быть установлены! Чтобы использовать его, вам просто нужно создать удаленный метод в контроллере. Команда loopback сообщает, что для реляционных случаев следует создать новый отдельный контроллер. Итак, в этом случае вы должны создать контроллер с именем question-response.controller.ts

Теперь вам просто нужно передать объект фильтра в интересующий вас метод. Давайте просто воспользуемся методом .find (), поскольку он самый простой. Должно получиться так:

@get('/question/{questionId}/response_data')
  async findQuestionWithResponses(
    @param.path.number('questionId') questionId: typeof Question.prototype.question_id,
      @param.query.object('filter', getFilterSchemaFor(Question)) filter?: Filter<Question>
  ): Promise<any> {
    if (!filter) filter = {};
    filter.include = [{ relation: 'responses' }];
    return this.questionRepository.findById(questionId, filter);
  }

Надеюсь, это поможет!

Также для отношения гнезд это будет выглядеть как пример в документации, как показано ниже, просто убедитесь, что все ваши отношения настроены :)

customerRepo.find({
  include: [
    {
      relation: 'orders',
      scope: {
        where: {name: 'ToysRUs'},
        include: [{relation: 'manufacturers'}],
      },
    },
  ],
});
person sirrele    schedule 11.01.2020