Sequelize.js外键

时间:2013-01-05 07:26:02

标签: mysql node.js orm 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 })

有没有办法强制Sequelize.js添加这些外键约束?

5 个答案:

答案 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_clientidClient已添加到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

它将链接为外键,您可以将其用作关联。让我知道我是否有任何遗漏。