如何在 feathersjs 项目中使用 sequelizejs 创建外键
How to create foreign keys with sequelizejs in a feathersjs project
我正在使用带有 sequelize v3.29.0 的 featherjs v2.0.3,我刚刚创建了三个模型,第三个与其他两个有关系。
我使用 feathers-cli 为每个生成服务,然后编辑每个的模型文件。
到目前为止一切顺利,创建了表(使用 PostgreSQL),创建了索引,feathersjs 很好地处理了 CRUD,但还没有处理外键。
所以,当我试图告诉 feathersjs 模型之间的关系时,我遇到了麻烦。
当我将 role_permission.belongsTo(permissions)
添加到 role_permission
模型时,出现此错误:
ReferenceError: permissions is not defined
正如我在 Sequelize 文档中看到的那样,模型是在相同的 "document" 中定义的,因此我怀疑问题出在某个地方,但我不明白需要做什么。
最后,这里是permission
和role_permission
模型定义的相关部分:
// permission-model.js - A sequelize model
module.exports = function(sequelize) {
const permission = sequelize.define('permissions', {
permission_id: {
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV1,
primaryKey: true,
allowNull: false
}...
}, ...);
permission.sync();
return permission;
};
// role_permission-model.js - A sequelize model
module.exports = function(sequelize) {
const role_permission = sequelize.define('role_permissions', {
permission_id: {
type: Sequelize.UUID,
allowNull: false
}...
}, ...);
role_permission.belongsTo(permissions) //<-- undefined?
role_permission.sync();
return role_permission;
};
你有什么建议可以帮助我解决这个问题吗?
谢谢!
您需要导入权限模型。但它可能还没有定义。
这是我在 github 上从 @mrpatiwi 那里发现的一种方法,可确保在设置关联之前加载每个模型。
首先,当您需要定义关系时,添加一个名为 associate 的类方法,它接受所有模型并设置关系。
module.exports = function(sequelize) {
const role_permission = sequelize.define('role_permisson', {
...
}, {
classMethods: {
associate(models) {
role_permission.belongsTo(models.permission);
},
},
});
// Don't add role_premission.sync() here
return role_permission;
};
然后,在src/services/index.js中module.exports函数的末尾,添加:
// Setup relationships
const models = sequelize.models;
Object.keys(models)
.map(name => models[name])
.filter(model => model.associate)
.forEach(model => model.associate(models));
sequalize.sync();
我遇到了同样的问题,只需更改以下内容即可解决:
role_permission.belongsTo(permissions)
对此:
role_permission.belongsTo(models.permissions)
(我今天使用 Feathers CLI 生成模型,2018 年 8 月 9 日)
我正在使用带有 sequelize v3.29.0 的 featherjs v2.0.3,我刚刚创建了三个模型,第三个与其他两个有关系。
我使用 feathers-cli 为每个生成服务,然后编辑每个的模型文件。
到目前为止一切顺利,创建了表(使用 PostgreSQL),创建了索引,feathersjs 很好地处理了 CRUD,但还没有处理外键。
所以,当我试图告诉 feathersjs 模型之间的关系时,我遇到了麻烦。
当我将 role_permission.belongsTo(permissions)
添加到 role_permission
模型时,出现此错误:
ReferenceError: permissions is not defined
正如我在 Sequelize 文档中看到的那样,模型是在相同的 "document" 中定义的,因此我怀疑问题出在某个地方,但我不明白需要做什么。
最后,这里是permission
和role_permission
模型定义的相关部分:
// permission-model.js - A sequelize model
module.exports = function(sequelize) {
const permission = sequelize.define('permissions', {
permission_id: {
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV1,
primaryKey: true,
allowNull: false
}...
}, ...);
permission.sync();
return permission;
};
// role_permission-model.js - A sequelize model
module.exports = function(sequelize) {
const role_permission = sequelize.define('role_permissions', {
permission_id: {
type: Sequelize.UUID,
allowNull: false
}...
}, ...);
role_permission.belongsTo(permissions) //<-- undefined?
role_permission.sync();
return role_permission;
};
你有什么建议可以帮助我解决这个问题吗? 谢谢!
您需要导入权限模型。但它可能还没有定义。
这是我在 github 上从 @mrpatiwi 那里发现的一种方法,可确保在设置关联之前加载每个模型。
首先,当您需要定义关系时,添加一个名为 associate 的类方法,它接受所有模型并设置关系。
module.exports = function(sequelize) {
const role_permission = sequelize.define('role_permisson', {
...
}, {
classMethods: {
associate(models) {
role_permission.belongsTo(models.permission);
},
},
});
// Don't add role_premission.sync() here
return role_permission;
};
然后,在src/services/index.js中module.exports函数的末尾,添加:
// Setup relationships
const models = sequelize.models;
Object.keys(models)
.map(name => models[name])
.filter(model => model.associate)
.forEach(model => model.associate(models));
sequalize.sync();
我遇到了同样的问题,只需更改以下内容即可解决:
role_permission.belongsTo(permissions)
对此:
role_permission.belongsTo(models.permissions)
(我今天使用 Feathers CLI 生成模型,2018 年 8 月 9 日)