42

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

4

5 に答える 5

45

同じ問題が発生する前に、Sequelize の設定の機能を理解すると解決しました。

ポイントにまっすぐ!

PersonFatherの 2 つのオブジェクトがあるとします。

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

于 2014-04-12T19:34:47.673 に答える
7

追加する必要がありますforeignKeyConstraint: true

試す:

MainClient.hasOne(MainDashboard, { foreignKey: 'idClient', foreignKeyConstraint: true })
于 2014-01-14T04:49:54.677 に答える
6

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

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' })

これにより、テーブルのフィールドに関連するテーブルにclientIdフィールドが作成されますmain_dashboardidmain_client

つまりbelongsTo、メソッドを呼び出しているテーブルにリレーションを追加し、hasOne引数として指定されたテーブルに追加します。

于 2013-01-05T20:27:25.980 に答える
2

驚くほど簡単です。

const MainDashboard = this.sequelize.define('main_dashboard', {/* attributes */}),
      MainClient    = this.sequelize.define('main_client', {/* attributes */});

MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' }); // Adds clientId to MainDashboard

これを外部キーとしてリンクし、関連付けとして使用できます。何か不足している場合はお知らせください。

于 2019-11-13T20:03:12.487 に答える