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 })
Sequelize.jsにこれらの外部キー制約を強制的に追加する方法はありますか?
同じ問題が発生する前に、Sequelizeの設定の機能を理解したときに解決しました。
まっすぐに!
2つのオブジェクトがあると仮定します:Personおよび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
たぶんそれはあなたを助ける
編集:
これを読んで理解を深めることができます。
http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys
Sequelize 4では、これが次のように更新されました。
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
私はあなたのコードを実行しようとしましたが、行はうまく作成されているようです:
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
がmain_client
に追加され、idClient
がmain_dashboard
に追加されます
HasOneメソッドの動作が少し混乱しているようです。 hasOneを呼び出すたびに関連付けが作成されるため、コードは2つのテーブルを事実上2回関連付けます。探しているメソッドはbelongsTo
です
各クライアントに1つのダッシュボードを持たせる場合、コードは次のようになります。
MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })
これにより、main_dashboardテーブルにclientIdフィールドが作成されます。これは、main_clientテーブルのidフィールドに関連しています。
要するに、belongsTo
はメソッドを呼び出しているテーブルにリレーションを追加し、hasOne
は引数として指定されたテーブルにリレーションを追加します。
ForeignKeyConstraint:trueを追加する必要があります
試してください
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })