Sequelize.js foreign key

社会主义新天地 提交于 2019-12-18 11:00:49

问题


When using Sequelize.js, the following code doesn't add any foreign key on tables.

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 })

Is there any way to force Sequelize.js to add these foreign key constraints?


回答1:


Before I had the same problem, and solved when I understood the functioning of settings Sequelize.

Straight to the point!

Suppose we have two objects: Person and 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

Maybe it help you

Edit:

You can read this to understand better:

http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys




回答2:


For Sequelize 4 this has been updated to the following:

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:


I just tried to run your code, and the rows seem to be created fine:

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 is added to main_client, and idClient is added to main_dashboard

It seems you have slightly confused what the hasOne method does. Each time you call hasOne an association is created, so your code effectively associates the two tables twice. The method you are looking for is belongsTo

If you want each client to have one dashboard, the code would be the following:

MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })

This creates a clientId field on the main_dashboard table, which relates to the id field of the main_client table

In short belongsTo adds the relation to the table that you are calling the method on, hasOne adds it on the table that is given as argument.




回答4:


You need to add foreignKeyConstraint:true
Try

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })



回答5:


Its amazingly simple.

var MainDashboard = this.sequelize.define('main_dashboard', {/* attributes */})
  , MainClient  = this.sequelize.define('main_client', {/* attributes */});

MainDashboard.belongsTo(MainClient, {foreignKey: 'clientId'}); // Adds clientId to MainDashboard

It will link this as a foreign key and you may use it as an association. Let me know if I'm missing anything.



来源:https://stackoverflow.com/questions/14169655/sequelize-js-foreign-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!