Sequelize.js foreign key

前端 未结 5 1585
长发绾君心
长发绾君心 2020-12-24 05:26

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

var MainDashboard = sequelize.define(\'main_dashboard\', {
  title: Sequ         


        
相关标签:
5条回答
  • 2020-12-24 06:09

    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 helps you

    Edit:

    You can read this to understand better:

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

    0 讨论(0)
  • 2020-12-24 06:12

    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.

    0 讨论(0)
  • 2020-12-24 06:18

    It's amazingly simple.

    const 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.

    0 讨论(0)
  • 2020-12-24 06:20

    For Sequelize 4 this has been updated to the following:

    const Father = sequelize.define('Father', {
            name: Sequelize.STRING
    });
    
    const Child = sequelize.define('Child', {
        age: Sequelize.STRING,
        fatherId: {
           type: Sequelize.INTEGER,
           references: {
              model: 'fathers', // 'fathers' refers to table name
              key: 'id', // 'id' refers to column name in fathers table
           }
        }
    });
    
    Father.hasMany(Child); // Set one to many relationship
    

    Edit: You can read more on associations at https://sequelize.org/master/manual/assocs.html

    0 讨论(0)
  • 2020-12-24 06:21

    You need to add foreignKeyConstraint: true

    Try:

    MainClient.hasOne(MainDashboard, { foreignKey: 'idClient', foreignKeyConstraint: true })
    
    0 讨论(0)
提交回复
热议问题