>웹 프론트엔드 >JS 튜토리얼 >Sequelize가 항상 외래 키 열을 생성하지 않는 이유는 무엇이며 이 문제를 어떻게 해결할 수 있습니까?

Sequelize가 항상 외래 키 열을 생성하지 않는 이유는 무엇이며 이 문제를 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-09 08:48:07507검색

Why Doesn't Sequelize Always Create Foreign Key Columns, and How Can I Fix This?

Sequelize가 특정 모델에 대해 외래 키 열을 생성하지 않는 이유는 무엇입니까?

Sequelize는 일반적으로 소속() 연관을 사용할 때 외래 키에 대한 새 열을 생성합니다. 그러나 일부 시나리오에서는 그렇지 않을 수 있습니다.

문제 이해

제공된 사용자 모델에 Sequelize가 role_id 열을 생성하지 못하는 시나리오 중 하나가 설명되어 있습니다. 이는 특히 동일한 프로젝트의 다른 모델이 예상된 동작을 보일 때 우려와 혼란을 야기합니다.

해결책: 중앙 집중식 모델 등록

해결책은 모든 모델과 해당 연관의 등록을 중앙 집중화하는 데 있습니다. 한 곳. 이를 통해 Sequelize가 모델 간의 적절한 관계를 설정할 수 있습니다.

구현

  1. 모델 등록을 처리하기 위해 단일 파일인 Database.js를 생성합니다.
  2. 모두 가져오기 모델 디렉토리 내의 모델 파일.
  3. 각 모델에 대해 Associate() 함수를 호출하여 모델 간의 관계를 정의합니다.
// database.js
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const db = {};

const sequelize = new Sequelize(/* your connection settings here */);
const models = path.join(__dirname, 'models');

fs.readdirSync(models).filter(file => file.indexOf('.') !== 0 && file !== 'basename' && file.slice(-3) === '.js').forEach(file => {
  const model = sequelize['import'](path.join(models, file));
  db[model.name] = model;
});

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.Sequelize = Sequelize;
db.sequelize = sequelize;

module.exports = db;
  1. 다른 모듈에서는 db 개체를 가져오고 이를 통해 모델과 연결에 액세스합니다.
// some_module.js
const db = require('../database');

const users = await db.user.findAll({
  where: {
    [db.Sequelize.Op.or]: [{
      first_name: 'Smith'
    }, {
      last_name: 'Smith'
    }]
   }
});

다음 단계를 수행하면 모든 모델이 올바르게 등록되었는지, 해당 연결이 제대로 설정되었는지 확인하여 Sequelize가 외래 키에 필요한 열을 생성할 수 있도록 할 수 있습니다.

위 내용은 Sequelize가 항상 외래 키 열을 생성하지 않는 이유는 무엇이며 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.