swa*_*ess 32 mysql orm node.js sequelize.js
使用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 })
Run Code Online (Sandbox Code Playgroud)
有没有办法强制Sequelize.js添加这些外键约束?
小智 30
在我遇到同样的问题之前,当我理解设置Sequelize的功能时解决了.
开门见山!
假设我们有两个对象:Person和Father
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
Run Code Online (Sandbox Code Playgroud)
也许它可以帮到你
编辑:
您可以阅读此内容以更好地理解:
http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys
Joh*_*edy 11
对于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
Run Code Online (Sandbox Code Playgroud)
我只是试图运行你的代码,似乎创建了行:
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;
Run Code Online (Sandbox Code Playgroud)
clientId被添加到main_client,并被idClient添加到main_dashboard
看来你有点混淆了hasOne方法的作用.每次调用hasOne时都会创建一个关联,因此您的代码会有效地将两个表关联两次.你正在寻找的方法是belongsTo
如果您希望每个客户端都有一个仪表板,则代码如下:
MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })
Run Code Online (Sandbox Code Playgroud)
这将在main_dashboard表上创建一个clientId字段,该字段与main_client表的id字段相关
简而言之,belongsTo添加与您调用方法的表的关系,hasOne将其添加到作为参数给出的表中.
你需要添加foreignKeyConstraint:true
试试
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41540 次 |
| 最近记录: |