Sequelize 模型關聯列建立差異
在 Sequelize 中,模型關聯建立不同模型之間的關係。然而,使用者報告了一些不一致的情況:Sequelize 無法為某些模型建立預期的外鍵列,但為其他模型建立成功。本文深入探討了可能的原因,並提供了解決此問題的解決方案。
最初的問題源自於一個模型,其中 Sequelize 沒有為 User 模型與 Role 模型的關聯建立 role_id 欄位。儘管嘗試了各種故障排除方法,問題仍然存在。
解決方案在於確保所有模型及其關聯都在一個中心位置註冊。透過這樣做,您可以確保 Sequelize 完全了解所有模型關係,並可以在與資料庫同步期間建立必要的欄位。
集中模型註冊
推薦的方法是建立database.js 檔案並在其中註冊所有模型。以下是 database.js 檔案的範例:
const fs = require('fs'); const path = require('path'); const Sequelize = require('sequelize'); const db = {}; const models = path.join(__dirname, 'models'); const sequelize = new Sequelize(/* your connection settings here */); 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; }); 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;
在此檔案中:
存取模型
一旦你有集中您的模型註冊,您可以使用從database.js匯出的db物件在其他模組中存取它們。以下是使用使用者模型的範例:
const db = require('../database'); ... const users = await db.user .findAll({ where: { [db.Sequelize.Op.or]: [{ first_name: 'Smith' }, { last_name: 'Smith' }] } })
透過集中模型註冊並確保正確定義關聯,您可以解決列建立不一致的問題並維護乾淨且有凝聚力的模型基礎架構。
以上是為什麼 Sequelize 有時無法建立關聯的模型列,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!