web-dev-qa-db-fra.com

Clé étrangère Sequelize.js

Lorsque vous utilisez Sequelize.js, le code suivant n'ajoute aucune clé étrangère sur les 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 })

Existe-t-il un moyen de forcer Sequelize.js à ajouter ces contraintes de clé étrangère?

30
swampcypress

Avant j'ai eu le même problème, et résolu quand j'ai compris le fonctionnement des paramètres Sequelize.

Droit au but!

Supposons que nous ayons deux objets: Personne et Père

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

Peut-être que cela vous aide

Éditer:

Vous pouvez lire ceci pour mieux comprendre:

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

30
Ilsondotcom

Pour Sequelize 4, cela a été mis à jour comme suit:

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
9
John Kennedy

J'ai juste essayé d'exécuter votre code, et les lignes semblent bien créées:

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 est ajouté à main_client et idClient est ajouté à main_dashboard

Il semble que vous ayez légèrement confondu ce que fait la méthode hasOne. Chaque fois que vous appelez hasOne, une association est créée, de sorte que votre code associe efficacement les deux tables deux fois. La méthode que vous recherchez est belongsTo

Si vous voulez que chaque client ait un tableau de bord, le code serait le suivant:

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

Cela crée un champ clientId sur la table main_dashboard, qui se rapporte au champ id de la table main_client

En bref belongsTo ajoute la relation à la table sur laquelle vous appelez la méthode, hasOne l'ajoute à la table qui est donnée en argument.

6
Jan Aagaard Meier

Vous devez ajouter foreignKeyConstraint: true
Essayer

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