如何使用Sequelize和mySql选择外键列的名称?

Sim*_*mon 6 mysql orm node.js sequelize.js

我正在使用sequelize在我的node-application中建模mySql数据库模式.我的模型的摘录如下所示:我有一个公司表和一个部门表.公司可以有多个部门,一个部门只属于一个公司.我将其建模如下:

公司表:

module.exports = function(sequelize, DataTypes){
return Company = sequelize.define('Company', {
    companyId: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true,
        unique: true            
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
})}
Run Code Online (Sandbox Code Playgroud)

部门表:

var Company = require('./company');

module.exports = function(sequelize,DataTypes) {
return Department = sequelize.define('Department', {
    departmentId: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true,
        unique: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false            
    },
    companyId: {
        type:           DataTypes.INTEGER,
        references:     'Companies',
        referencesKey:  'companyId',
        onDelete:       'cascade'
    }
});}
Run Code Online (Sandbox Code Playgroud)

要将此架构实际存储在数据库中,请使用以下代码:

var db = require('../models/index');
db["Company"].hasMany(db["Department"], {as: 'departments'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId', foreignKeyConstraint: true});

models.sequelize.sync().complete(function(err){
    //irrelevant for the problem
});
Run Code Online (Sandbox Code Playgroud)

问题是此代码在department表中创建了2个外键.一个在"companyId"字段(如预期的那样),但也在"CompanyCompanyId"字段上,一个自动生成的字段.

如何确保只使用和创建我定义的外键('companyId')?

Sim*_*mon 20

我设法解决了这个问题:

它不应仅在belongsTo语句中使用"foreignKey"选项,而应在"hasMany"语句中使用.

在原始问题中发布的两个模型保持不变.我唯一需要改变的是foreignKey选项的位置:

var db = require('../models/index');
db["Company"].hasMany(db["Department"], {as: 'departments'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId', foreignKeyConstraint: true});
Run Code Online (Sandbox Code Playgroud)

变成:

var db = require('../models/index');
db["Company"].hasMany(db["Department"], { foreignKey: 'companyId'});
db["Department"].belongsTo(db["Company"], {foreignKey: 'companyId'});
Run Code Online (Sandbox Code Playgroud)

  • 如果你有`foreignKey`的其他选项(例如`allowNull:false`),你可以使用`name`指定它的名字:`foreignKey:{name:'companyId',allowNull:false}`. (2认同)

小智 5

在 4.4.0 版本中,belongsTo 函数有一个 targetKey 选项。

const User = this.sequelize.define('user', {/* attributes */})
const Company  = this.sequelize.define('company', {/* attributes */});

User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); // Adds fk_companyname to User
Run Code Online (Sandbox Code Playgroud)

有关http://docs.sequelizejs.com/manual/tutorial/associations.html#target-keys 的更多信息