ホームページ > ウェブフロントエンド > jsチュートリアル > Sequelize がモデルの関連付けに外部キー列を作成しないのはなぜですか?

Sequelize がモデルの関連付けに外部キー列を作成しないのはなぜですか?

Susan Sarandon
リリース: 2024-12-06 15:16:11
オリジナル
620 人が閲覧しました

Why Doesn't Sequelize Create My Foreign Key Column in Model Associations?

Sequelize モデルの関連付けで外部キー列が作成されない

Sequelize では、関連付けによって 2 つ以上のモデル間の関係が定義されます。関連データにアクセスし、複雑なクエリを実行するための便利な方法を提供します。ただし、一部のユーザーは、Sequelize が特定のモデルの外部キー列を作成しないという問題に遭遇します。この問題は、他のモデルの関連付け定義が同じであるにもかかわらず発生します。

外部キーの作成について

Sequelize は、2 つのモデル間で関連付けが確立されると、外部キー列を自動的に作成します。これは、関連付けオプションで externalKey プロパティが指定されている場合に発生します。たとえば、提供された User モデルでは、belongsTo 関連付けが role_id の externalKey で定義されています。通常、これにより User テーブルに role_id 列が作成されます。

問題の解決

この問題の解決策は、すべてのモデルが中央の 1 つの場所に登録され、関連付けられます。モデルの登録と関連付けを一元化することで、Sequelize は依存関係を正しく処理し、必要な外部キー列を作成できます。

一元化されたモデルの登録と関連付けの実装

次のコードは、その方法を示しています。モデルを 1 つのファイルに登録して関連付けます:

// database.js

// Register all models in one place
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const db = {};

const models = path.join(__dirname, 'models');

// Create a Sequelize instance
const sequelize = new Sequelize(/* your connection settings here */);

// Register models and add them to the db object
fs.
  readdirSync(models).
  filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  }).
  forEach(function (file) {
    // Sequelize version <= 5.x
    var model = sequelize['import'](path.join(models, file));
    // Sequelize version >= 6.x
    // var model = require(path.join(models, file))(
    //   sequelize,
    //   Sequelize.DataTypes
    // );
    db[model.name] = model;
  });

// Associate models within the db object
Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.Sequelize = Sequelize; // for accessing static props and functions like Op.or
db.sequelize = sequelize; // for accessing connection props and functions like 'query' or 'transaction'

module.exports = db;
ログイン後にコピー

使用法例

コードベースの他のモジュールでは、一元化されたデータベース接続にアクセスし、次のように登録されたモデルを使用できます。

const db = require('../database');
const { Op } = require('sequelize');

// Use models defined in database.js
const users = await db.user.findAll({
  where: {
    [Op.or]: [
      {
        first_name: 'Smith'
      },
      {
        last_name: 'Smith'
      }
    ]
  }
});
ログイン後にコピー

これらのガイドラインに従うことで、次のことを保証できます。すべての Sequelize モデルが正しく関連付けられており、適切な外部キー列が作成されていること。

以上がSequelize がモデルの関連付けに外部キー列を作成しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート