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?
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
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
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.
Vous devez ajouter foreignKeyConstraint: true
Essayer
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })