Внешний ключ Sequelize.js
При использовании Sequelize.js следующий код не добавляет внешнего ключа в таблицы.
var MainDashboard = sequelize.define('main_dashboard', {
title: Sequelize.STRING
}, {
freezeTableName: true
})
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' })
MainDashboard.hasOne(MainClient, { foreignKey: 'clientId' })
sequelize.sync({ force: true })
Есть ли способ заставить Sequelize.js добавить эти ограничения внешнего ключа?
Ответы
Ответ 1
Раньше у меня была такая же проблема, и она решалась, когда я понимал функционирование настроек Sequelize.
Прямо к сути!
Предположим, у нас есть два объекта: Личность и Отец.
var Person = sequelize.define('Person', {
name: Sequelize.STRING
});
var Father = sequelize.define('Father', {
age: Sequelize.STRING,
//The magic start here
personId: {
type: Sequelize.INTEGER,
references: 'persons', // <<< Note, its table name, not object name
referencesKey: 'id' // <<< Note, its a column name
}
});
Person.hasMany(Father); // Set one to many relationship
Может быть, это поможет вам
Редактировать:
Вы можете прочитать это, чтобы понять лучше:
http://docs.sequelizejs.com/manual/tutorial/associations.html#foreign-keys
Ответ 2
Я просто пытался запустить ваш код, и строки, кажется, созданы отлично:
CREATE TABLE IF NOT EXISTS `main_dashboard` (`title` VARCHAR(255), `id` INTEGER NOT NULL auto_increment , `idClient` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `main_client` (`id` INTEGER NOT NULL auto_increment, `clientId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
clientId
добавляется к main_client
, а idClient
добавляется к main_dashboard
Кажется, вы немного смутили то, что делает метод hasOne. Каждый раз, когда вы вызываете hasOne, создается ассоциация, поэтому ваш код эффективно связывает две таблицы дважды. Метод, который вы ищете, belongsTo
Если вы хотите, чтобы у каждого клиента была одна панель, код был бы следующим:
MainClient.hasOne(MainDashboard, { foreignKey: 'clientId' })
MainDashboard.belongsTo(MainClient, { foreignKey: 'clientId' })
Это создает поле clientId в таблице main_dashboard, которая относится к полю id таблицы main_client
Короче belongsTo
добавляет отношение к таблице, на которую вы вызываете метод, hasOne
добавляет его в таблицу, указанную в качестве аргумента.
Ответ 3
Вам нужно добавить foreignKeyConstraint: true
Попробуйте
MainClient.hasOne(MainDashboard, { foreignKey: 'idClient' , foreignKeyConstraint:true })
Ответ 4
Для Sequelize 4 это было обновлено до следующего:
const Person = sequelize.define('Person', {
name: Sequelize.STRING
});
const Father = sequelize.define('Father', {
age: Sequelize.STRING,
personId: {
type: Sequelize.INTEGER,
references: {
model: 'persons', // 'persons' refers to table name
key: 'id', // 'id' refers to column name in persons table
}
}
});
Person.hasMany(Father); // Set one to many relationship