web-dev-qa-db-ja.com

Sequelize.js外部キー

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にこれらの外部キー制約を強制的に追加する方法はありますか?

30
swampcypress

同じ問題が発生する前に、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

30
Ilsondotcom

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

私はあなたのコードを実行しようとしましたが、行はうまく作成されているようです:

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;

clientIdmain_clientに追加され、idClientmain_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は引数として指定されたテーブルにリレーションを追加します。

6

ForeignKeyConstraint:trueを追加する必要があります
試してください

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