Man*_*ieh 3 node.js sequelize.js
我正在使用这种方式将我的Sequelize模型保存在单独的文件中,一切都运行良好,但现在我想出了包含其中的范围的想法.
这样的东西不起作用:
var User = sequelize.define("User", {...}, {
scopes: {
complete: {
include: [{
model: Task
}]
}
}
});
Run Code Online (Sandbox Code Playgroud)
...因为任务(当然)没有定义.即使使用require('.').Task相反也没有帮助,因为User在加载之前Task和User加载时加载,Task尚未定义.
那么,有一种简单易行的方法,没有十几种解决方法
小智 10
如果模型(任务)尚未加载?(在这种情况下,T出现在U之前并加载模型).
Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
Run Code Online (Sandbox Code Playgroud)
变
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);
}
});
Run Code Online (Sandbox Code Playgroud)
和模型
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
username: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
User.hasMany(models.Task)
}
}
});
return User;
};
Run Code Online (Sandbox Code Playgroud)
变
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
username: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
User.hasMany(models.Task)
}
loadScopes: function(models) {
User.addScope('complete', {
include: [{
model: models.Task
}]
})
}
}
});
return User;
};
Run Code Online (Sandbox Code Playgroud)
使用该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;
};
Run Code Online (Sandbox Code Playgroud)
使用默认范围:
User.findAll();
这将默认使用默认范围。
使用byProfile范围:
User.scope({ method: ['byProfile', profile.id] }).findAll();
| 归档时间: |
|
| 查看次数: |
4499 次 |
| 最近记录: |