使用Sequelize.js时,以下代码不会在表上添加任何外键。
var MainDashboard = sequelize.define('main_dashboard', {
title: Sequelize.STRING
}, {
freezeTableName: true
})
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' })
MainDashboard.hasOne(MainClient, { foreignKey: 'clientId' })
sequelize.sync({ force: true })
有没有办法强制Sequelize.js添加这些外键约束?
答案 0 :(得分:28)
在我遇到同样的问题之前,当我理解设置Sequelize的功能时解决了。
直截了当!
假设我们有两个对象:人和父
var Person = sequelize.define('Person', {
name: Sequelize.STRING
});
var Father = sequelize.define('Father', {
age: Sequelize.STRING,
//The magic start here
personId: {
type: Sequelize.INTEGER,
references: 'persons', // <<< Note, its table's name, not object name
referencesKey: 'id' // <<< Note, its a column name
}
});
Person.hasMany(Father); // Set one to many relationship
也许它会帮助你
编辑:
您可以阅读本文以便更好地理解:
http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys
答案 1 :(得分:6)
我只是尝试运行您的代码,并且行似乎创建得很好:
CREATE TABLE IF NOT EXISTS `main_dashboard` (`title` VARCHAR(255), `id` INTEGER NOT NULL auto_increment , `idClient` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `main_client` (`id` INTEGER NOT NULL auto_increment, `clientId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
clientId
已添加到main_client
,idClient
已添加到main_dashboard
看起来你有点混淆了hasOne方法的作用。每次调用hasOne时都会创建一个关联,因此您的代码会有效地将两个表关联两次。您要查找的方法是belongsTo
如果您希望每个客户都有一个仪表板,则代码如下:
MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })
这将在main_dashboard表上创建一个clientId字段,该字段与main_client表的id字段相关
简而言之belongsTo
添加了与调用方法的表的关系,hasOne
将其添加到作为参数给出的表中。
答案 2 :(得分:6)
对于Sequelize 4,这已更新为以下内容:
const Person = sequelize.define('Person', {
name: Sequelize.STRING
});
const Father = sequelize.define('Father', {
age: Sequelize.STRING,
personId: {
type: Sequelize.INTEGER,
references: {
model: 'persons', // 'persons' refers to table name
key: 'id', // 'id' refers to column name in persons table
}
}
});
Person.hasMany(Father); // Set one to many relationship
答案 3 :(得分:5)
您需要添加foreignKeyConstraint:true
试试
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })
答案 4 :(得分:0)
它非常简单。
var MainDashboard = this.sequelize.define('main_dashboard', {/* attributes */})
, MainClient = this.sequelize.define('main_client', {/* attributes */});
MainDashboard.belongsTo(MainClient, {foreignKey: 'clientId'}); // Adds clientId to MainDashboard
它将链接为外键,您可以将其用作关联。让我知道我是否有任何遗漏。