Loopback 4包含嵌套关系

问题描述 投票:1回答:1

最近的环回团队增加了对嵌套关系的支持。参考https://loopback.io/doc/en/lb4/HasMany-relation.html#query-multiple-relations。但这并未涵盖其余的api网址以获取嵌套关系。这就是我尝试过的。

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

我有三个模型用户,购物车,产品。用户有多个购物车,并且购物车属于产品。我的环回/ 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);

  }

提前感谢

loopbackjs loopback4
1个回答
1
投票

我已经成功实现了与MySQL作为数据源的关系。该文档确实共享使用非关系数据库的行为会出现意外情况。如果是这种情况,那么您应该查看其进度。.loopback relations open issue

我们的示例模型将是问题(源)和响应(目标)。问题与响应具有hasMany关系

配置模型以处理关系,一次处理一个关系

  • [您应该使用@hasMany装饰器将新属性添加到您的Question模型中,看起来像这样

    @@ hasMany(()=>响应,{keyTo:'question_id',name:'responses'}})回应?:回应[]

  • 注意keyTo是将允许该关系工作的外键,并且name只是该关系的名称

  • 如果尚未定义外键属性,请在您的Question模型中添加它。可以使用常规的@property()装饰器完成,也可以使用以下

    @@ belongsTo(()=>问题,{名称:'question',keyTo:'question_id'})问题ID ?:数字;

在源模型存储库(问题)中,您需要提供对目标模型(响应)的访问,类似于以下内容:

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);
  }
}
  • 确保添加添加注册包含解析器的最后一行

现在应该建立您的关系!要使用它,您只想在控制器内创建一个远程方法。回送团队确实传达了应该为关系案例创建一个新的单独控制器的信息。因此,在这种情况下,您将创建一个名为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'}],
      },
    },
  ],
});
© www.soinside.com 2019 - 2024. All rights reserved.