2015-01-20 1 views
4

Я использую sequelize для моделирования схемы mySql-базы данных в моем приложении-узле. Экстракт моей модели выглядит так: У меня есть стол компании и стол отдела. Компания может иметь несколько отделов, а отдел принадлежит только одной компании. Я смоделировал это следующим образом:Как выбрать название столбца Foreign Key, используя Sequelize и 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 
    } 
})} 

Отдел стол:

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' 
    } 
});} 

Чтобы действительно сохранить эту схему в базе данных я использую следующий код:

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 
}); 

Проблема в том, что этот код создает 2 внешних ключа в таблице отдела. Один на поле «companyId» (как и ожидалось), но также и на поле «CompanyCompanyId», поле, которое автоматически генерируется.

Как я могу убедиться, что только внешний ключ, который я определил ('companyId'), используется и создается?

ответ

14

мне удалось решить эту проблему:

Вместо только с помощью «ForeignKey» -Option в belongsTo-заявлении, следует также использовать в «hasMany» -statement.

Две модели, которые были опубликованы в исходном вопросе, остались прежними. Единственное, что мне пришлось изменить было расположение опции ForeignKey:

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

изменено на:

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

Да, то же значение foreignKey по обе стороны от отношения решает проблему, спасибо! – Xdg

+1

Если у вас есть дополнительные опции для 'foreignKey' (например,' allowNull: false'), вы можете указать его имя, используя 'name':' foreignKey: {name: 'companyId', allowNull: false} '. –

+0

Привет, Саймон, я пытаюсь создать внешний ключ, вы можете мне помочь? – Kannan

0

Sequelize создает для вас поле foreignKey. Поэтому нет необходимости определять поле companyId в модели Department, если вы используете belongsTo.

В текущем сценарии он создаст два внешних ключа, определенных в модели, а другой через belongsTo, и когда он попытается создать foreignKey снова, он обнаруживает, что это поле уже существует, поэтому оно создает другое поле.

+0

Спасибо за ваш комментарий. Я заметил, что sequelize создает для меня поле foreignKey. Он называется «CompanyCompanyId», но я хотел бы дать ему имя, которое я определил (т. Е. «CompanyId» вместо «CompanyCompanyId»). Вы знаете, как я могу это достичь? – Simon

+1

Вы можете указать его, используя опцию 'as'. Ex. 'db [" Department "]. принадлежит (db [" Company "], {as: 'companyId', foreignKey: 'companyId', foreignKeyConstraint: true});' –

+0

Спасибо за ваш вклад Nilesh, но мне удалось исправить его иначе , Проверьте мой собственный ответ, чтобы узнать, как я это сделал. – Simon

0

В версии 4.4.0, есть вариант targetKey для функции belongsTo. более

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 

информация о http://docs.sequelizejs.com/manual/tutorial/associations.html#target-keys