如何在包含在 mixin 中的模型上的 Loopback 4 中设置 table 名称?

How to set table name in Loopback 4 on a model that is wrapped in mixin?

我需要在 Loopback 4 模型上显式设置数据库 table 名称。我使用 @model 装饰器来做到这一点,如下所示:

@model({settings: {postgresql: {schema: 'public', table: 'dbtablename'}}})
class MyModel extends Entity {
...

在简单的情况下,它工作正常。但是我现在需要 扩展 模型,使用 AuditMixin 添加时间戳 属性 到模型。这采用上面声明的模型和 returns 扩展模型。

这是 mixin 的代码:

import {MixinTarget} from '@loopback/core';
import {property} from '@loopback/repository';

export function AuditMixin<T extends MixinTarget<object>>(baseClass: T) {
  class Mixin extends baseClass {
    timestamp: Date;
    constructor(...args: any[]) {
      super(args);
      this.timestamp= new Date();
    }
  }
  return Mixin;
}

Mixin 用法:

class MyModelWithMixin extends AuditMixin(MyModel) {}

问题:

Loopback 似乎不尊重我在装饰器中提供的 table 名称。在我的数据库日志中,我可以看到它试图访问 table public.mymodelwithmixin。数据库日志行是:

ERROR: relation "public.mymodelwithmixin" does not exist at character xyz

结果证明解决方案非常简单:我需要装饰我使用 mixin 的地方。

@model({
  settings: {postgresql: {schema: 'public', table: 'dbtablename'}},
})
class MyModelWithMixin extends AuditMixin(MyModel) {}