我使用this way将我的Sequelize模型保存在单独的文件中,一切运行良好但现在我想出了包含其中包含范围的想法。
这样的事情不起作用:
@Entity
@DiscriminatorValue("CUSTOMER") // set the value of the column for customer location rows
public class CustomerLocationEntity extends LocationEntity {
}
...由于任务(当然)没有定义。即使使用var User = sequelize.define("User", {...}, {
scopes: {
complete: {
include: [{
model: Task
}]
}
}
});
而在此时也没有帮助,因为require('.').Task
在User
之前加载,加载Task
时,User
不是尚未定义。
那么,有没有十几种变通方法的简单方法
答案 0 :(得分:8)
如果模型(任务)尚未加载? (在这种情况下,T出现在U之前并加载模型)。
.snapshotStream
成为
Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
和模型
Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
Object.keys(db).forEach(function(modelName) {
if ("loadScopes" in db[modelName]) {
db[modelName].loadScopes(db);
}
});
变为
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
username: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
User.hasMany(models.Task)
}
}
});
return User;
};
答案 1 :(得分:1)
尝试使用Sequelize.models.Task
module.export = function(Sequelize, DataTypes){
var User = sequelize.define("User", {...}, {
scopes: {
complete: {
include: [{
model: Sequelize.models.Task
}]
}
}
});
}
或者使用addScope()
添加它们,而不必担心加载每个模型的顺序
答案 2 :(得分:1)
对于范围中的包含模型,使用addScope()
方法更好。这是因为Sequelize模型是按字母顺序定义的,Model A
首先位于Model B
之前。当您在Model B
范围内包含Model A
时,Model A
运行时Model B
尚未定义。 addScope()
方法解决了这个问题。
module.exports = function(sequelize, DataTypes) {
const User = sequelize.define('User', {
username: DataTypes.STRING
}, { });
User.associate = function(models) {
// associations can be defined here
User.hasMany(models.Task);
// scopes should be defined here
User.addScope('defaultScope', {
include: [{ model: models.Task }],
});
// scopes with parameter
User.addScope('byProfile', profileId => ({
where: { profileId },
}));
};
return User;
};
使用默认范围:
User.findAll();
默认情况下,它将使用默认范围。
使用byProfile
范围:
User.scope({ method: ['byProfile', profile.id] }).findAll();