sequelize-typescript:模型中get()的通用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sequelize-typescript:模型中get()的通用方法相关的知识,希望对你有一定的参考价值。

我在START_DATE,END_DATE,MEET_START_DATE,MEET_END_DATE定义了一些get()函数。如果仔细观察为这些列定义的get()函数,它们非常相似。所以我试图为所有这些get()函数定义一个通用函数。一个类似于最后定义的getDay()的函数。但是我无法在get()方法中调用getDay()。我无法访问它。如何从get()函数或类似的东西调用getDay()?我还需要传递参数,以便我可以访问字段名称和实例。

import {Table, Column, Model, DataType} from 'sequelize-typescript';

@Table({
    timestamps: false,
    freezeTableName: true,
    schema: 'TEST',
    tableName: 'Person'
})
export class Person extends Model<Person> {
    @Column({ type: DataType.STRING, primaryKey: true })
    ID: string;
    @Column(DataType.STRING)
    NAME: string;      
    @Column({type:DataType.DATEONLY,
        get(){
            let value : Date = this.getDataValue('START_DATE');
            return value.getDay();
        }})
    START_DATE: Date;
    @Column({type:DataType.DATEONLY,
        get(){
            let value : Date = this.getDataValue('END_DATE');
            return value.getDay();
        }})
    END_DATE: Date;
    @Column({type:DataType.DATEONLY,
        get(){
            let value : Date = this.getDataValue('MEET_START_DATE');
            return value.getDay();
        }})
    MEET_START_DATE: Date;
    @Column({type:DataType.DATEONLY,
        get(){
            let value : Date = this.getDataValue('MEET_END_DATE');
            return value.getDay();

            }})
    MEET_END_DATE: Date;


     getDay(field,instance) {
        let value : Date = instance.getDataValue(field);
        return value.getDay();


    }
}
答案

最简单的方法是在Person类之外定义你的常用函数:

import {Table, Column, Model, DataType} from 'sequelize-typescript';

function getDayOfField(field: string, instance: Model<any>) {
    let value : Date = instance.getDataValue(field);
    return value.getDay();
}

@Table({
    timestamps: false,
    freezeTableName: true,
    schema: 'TEST',
    tableName: 'Person'
})
export class Person extends Model<Person> {
    @Column({ type: DataType.STRING, primaryKey: true })
    ID: string;
    @Column(DataType.STRING)
    NAME: string;      
    @Column({type:DataType.DATEONLY,
        get(){ return getDayOfField('START_DATE', this); }})
    START_DATE: Date;
    @Column({type:DataType.DATEONLY,
        get(){ return getDayOfField('END_DATE', this); }})
    END_DATE: Date;
    @Column({type:DataType.DATEONLY,
        get(){ return getDayOfField('MEET_START_DATE', this); }})
    MEET_START_DATE: Date;
    @Column({type:DataType.DATEONLY,
        get(){ return getDayOfField('MEET_END_DATE', this); }})
    MEET_END_DATE: Date;
}

(定义并将其称为Person的静态方法将大致相同。)如果你真的想让它成为一个实例方法,你可以尝试在你的this实现中将Person转换为get,这可能会起作用取决于sequelize在运行时(我不熟悉它)。

以上是关于sequelize-typescript:模型中get()的通用方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Sequelize-Typescript 模型定义指定 NestJs 控制器的返回类型?

sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块

Node.js 和 sequelize-typescript - 数据访问对象和业务对象

Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数

Sequelize beforeConnect 钩子与 sequelize-typescript 未运行

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组