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中文网其他相关文章!