[英]How to extend a Sequelize model?
有沒有辦法可以使用一個基類,它具有我的模型的所有公共屬性和方法,但沒有與數據庫表鏈接,然后我可以在定義新模型時擴展這個基類。
在這里,我在node express中創建了基礎,人員模型。 我需要從基類擴展person類。
const person = sequelizeClient.define('person', {
name: {
type: DataTypes.STRING,
allowNull: false
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
const base = sequelizeClient.define('base', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
},
createdBy: {
type: Sequelize.INTEGER,
},
updatedBy: {
type: Sequelize.INTEGER,
},
deletedBy: {
type: Sequelize.INTEGER,
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
在文檔中說明了這一點
Sequelize Models是ES6類。您可以非常輕松地添加自定義實例或類級別方法。
我怎樣才能使用ES6擴展類模式?
有一個類似的問題,但最近沒有更新。 如何擴展Sequelize模型
我怎樣才能使用ES6擴展類模式?
Sequelize docs中的聲明對開發人員來說有點混亂。 這並不意味着您可以使用ES6類語法擴展已定義的模型,如下所示。
const User = db.define('User', {
name: sequelize.STRING,
age: sequelize.INTEGER
});
// This is impossible.
class Staff extends User {
...
}
但您可以通過訪問如下所示的原型來定義實例方法。
const User = db.define('User', {
name: sequelize.STRING,
age: sequelize.INTEGER
});
User.Instance.prototype.test = function() {
return `Name: ${this.name}, Age: ${this.age}`
}
User.create({ name: "John", age: 10 });
User.findOne().then((user) => {
console.log(user.test()) // "Name: John, Age: 10"
});
你在Sequelize doc中提到的聲明實際上是說你可以使用基於原型的擴展來增強模型行為,所以你不能做你嘗試在問題中做的模型繼承。
有很多關於Sequelize像ES6類語法的實施方案討論這個 ,但它仍然是討論它看起來。
由於Sequelize似乎無法擴展類模型,如何擴展sequelize對象的配置對象呢? 這是更多的工作,但提供最接近的體驗,並保持相對清潔。 當然,使用attributes
和options
參數需要使用2個單獨的類或組合類的正確解構。
class Base {
constructor() {
this.id = {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
};
...
}
}
class Person extends Base {
constructor() {
super();
this.name = {
type: DataTypes.STRING,
allowNull: false
};
...
}
}
// using separate class for attributes
const person = sequelize.define('person', new Person());
// possible destructuring of attributes/options
const someModel= sequelize.define('someModel', (new SomeModel()).attributes, (new SomeModel()).options);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.