source

Sequelize.js 외래 키

lovecheck 2023. 10. 19. 22:25
반응형

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가 이러한 외래 키 제약 조건을 추가하도록 강제할 수 있는 방법이 있습니까?

동일한 문제가 발생하기 전에 Sequelize 설정의 기능을 이해했을 때 해결했습니다.

바로 본론으로!

두 개의 객체가 있다고 가정합니다.사람아버지

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 Father = sequelize.define('Father', {
        name: Sequelize.STRING
});

const Child = sequelize.define('Child', {
    age: Sequelize.STRING,
    fatherId: {
       type: Sequelize.INTEGER,
       references: {
          model: 'fathers', // 'fathers' refers to table name
          key: 'id', // 'id' refers to column name in fathers table
       }
    }
});

Father.hasMany(Child); // Set one to many relationship

편집: https://sequelize.org/master/manual/assocs.html 에서 연관성에 대해 더 자세히 읽을 수 있습니다.

추가할 필요가 있습니다.foreignKeyConstraint: true

시도:

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

코드를 실행하려고 했는데 행이 제대로 생성된 것 같습니다.

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코드가 두 개의 테이블을 효과적으로 두 번 연결하도록 연결됩니다.당신이 찾는 방법은belongsTo

각 클라이언트에 대시보드가 하나씩 있기를 원할 경우 코드는 다음과 같습니다.

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

이렇게 하면 다음이 생성됩니다.clientId현장에.main_dashboard테이블, 에 관련된id야전의main_client테이블

요컨대belongsTo메서드를 호출할 테이블에 관계를 추가합니다.hasOne인수로 주어진 테이블에 추가합니다.

놀랍도록 간단합니다.

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

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

이것을 외국 키로 연결할 것이고 당신은 그것을 연관으로 사용할 수 있습니다.제가 부족한 게 있으면 알려주세요.

언급URL : https://stackoverflow.com/questions/14169655/sequelize-js-foreign-key

반응형