2013-01-05 1 views
14

Lors de l'utilisation de Sequelize.js, le code suivant n'ajoute aucune clé étrangère sur les tables.Clé étrangère 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 }) 

Est-il possible de forcer Sequelize.js à ajouter ces contraintes de clé étrangère?

Répondre

3

Je viens d'essayer d'exécuter votre code, et les lignes semblent créer bien:

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 un peu confus ce que fait la méthode hasOne. Chaque fois que vous appelez hasOne, une association est créée, de sorte que votre code associe effectivement les deux tables deux fois. La méthode que vous recherchez est belongsTo

Si vous voulez que chaque client d'avoir un tableau de bord, le code serait la suivante:

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

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

En résumé belongsTo ajoute la relation à la table sur laquelle vous appelez la méthode, hasOne l'ajoute à la table indiquée comme argument.

+0

D'accord, comprenez-moi. En fait, ce n'est qu'un exemple stupide. Ce que nous voulons, ce sont des contraintes de clés étrangères au niveau de la base de données, tout comme @dankohn. – swampcypress

4

Vous devez ajouter ForeignKeyConstraint: true
Essayez

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

Avant d'avoir le même problème, et résolu quand je compris le fonctionnement des paramètres Sequelize.

Directement au point!

Supposons que nous avons 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 vous aider

Edit:

Vous pouvez lire ceci pour mieux comprendre:

http://docs.sequelizejs.com/en/1.7.0/docs/associations/#foreign-keys

+2

L'utilisation de 'references' et' referencesKey' est maintenant obsolète => 'Utils obsolète propriété non-objet références trouvées. Le support pour cela sera supprimé dans la version 4. Expected {references: {model: "value", key: "key"}} au lieu de {references: "value", referencesKey: "key"} .' –

+7

ce n'est pas un bon exemple, la dernière commande dit que «une personne a beaucoup de pères» qui ne semble pas naturel – Buksy

Questions connexes