Внешний ключ Sequelize.js - программирование

Внешний ключ 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 добавить эти ограничения внешнего ключа?

4b9b3361

Ответ 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