You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Loopback 4中被mixin包裹的模型如何正确设置数据库表名?

问题原因

Loopback 4 的 @model 装饰器生成的表名、schema 等配置元数据直接绑定在被装饰的原类上。通过 mixin 扩展生成的新类 MyModelWithMixin 未主动继承原模型的配置时,Loopback 会默认将新类名转换为蛇形作为默认表名,因此会尝试访问不存在的 public.mymodelwithmixin 表。

解决方案

方案1:为扩展后的新模型显式指定配置(适合少量使用场景)

直接在生成的新类上叠加 @model 装饰器,复用原有配置即可:

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

方案2:修改 AuditMixin 自动继承原模型配置(适合全局复用场景)

调整 mixin 代码,给动态生成的内部类加上 @model 装饰器,自动合并原类的所有模型配置,不需要每个使用的地方重复写配置:

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

export function AuditMixin<T extends MixinTarget<object>>(baseClass: T) {
  // 读取原模型的已有配置
  const baseModelSettings = baseClass?.definition?.settings ?? {};
  @model({
    settings: {
      ...baseModelSettings,
      inheritBaseModel: true
    }
  })
  class Mixin extends baseClass {
    // 注意timestamp要加@property装饰器,否则Loopback不会识别为模型字段
    @property({
      type: 'date',
      required: true
    })
    timestamp: Date;
    constructor(...args: any[]) {
      // 修正原代码的参数传递错误,要展开args
      super(...args);
      this.timestamp = new Date();
    }
  }
  return Mixin;
}

额外提示:原mixin代码有两处小问题:一是timestamp没有加@property装饰器,不会被识别为模型字段;二是构造函数调用super时没有展开args,会导致原模型属性初始化异常,上面的代码已经修正。

修改后原有使用方式无需调整,即可正常识别原模型配置的表名:

class MyModelWithMixin extends AuditMixin(MyModel) {}

内容的提问来源于stack exchange,提问作者Irfanullah Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 18:36:06