(Sequelize) Ассоциация hasOne не создает внешний ключ - PullRequest
1 голос
/ 11 июня 2019

Я создал две модели следующим образом

UserModel

const UserModel = database.define("user", {
    name: {
        type: Sequelize.STRING(30),
        allowNull: false,
        validate: {
            notNull: {
                msg: "name is required"
            },
            notEmpty: {
                msg: "name cannot be empty"
            }
        }
    },
    email: {
        type: Sequelize.STRING(30),
        allowNull: false,
        unique: true,
        validate: {
            isEmail: {
                msg: "invalid email provided"
            },
            notNull: {
                msg: "email is required"
            },
            notEmpty: {
                msg: "email cannot be empty"
            }
        }
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
            notNull: {
                msg: "password is required"
            },
            notEmpty: {
                msg: "password cannot be empty"
            }
        }
    }
})

UserType

const UserType = database.define("userType", {
    name: {
        type : Sequelize.STRING(30),
        allowNull: false,
        validate: {
            notNull: {
                msg: "name is required"
            },
            notEmpty: {
                msg: "name cannot be empty"
            }
        }
    }
})

Моя обязательная ассоциация выглядит следующим образом

  1. Каждый UserModel должен иметь один статус. Я использую sqlite в качестве диалекта.

Для этого я кодирую как

UserModel.hasOne(UserType, { foreignKey: { allowNull : false }, onDelete: "CASCADE" })

для этого сгенерированного SQL следует

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ users (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR (30) NOT NULL, email VARCHAR (30) NOT NULL UNIQUE, password VARCHAR (255) NOT NULL , createdAt DATETIME NOT NULL, updatedAt DATETIME NOT NULL);

Я видел объявление ассоциации обоими способами, например:

UserModel.hasOne(UserType, { foreignKey: { allowNull : false }, onDelete: "CASCADE" })
UserType.hasMany(UserModel, { foreignKey: { allowNull : false }, onDelete: "CASCADE" })

В этом случае SQL генерируется следующим образом

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ users (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR (30) NOT NULL, lastName VARCHAR (30) NOT NULL, email VARCHAR (30) NOT NULL UNIQUE , password VARCHAR (255) NOT NULL, createdAt DATETIME NOT NULL, updatedAt DATETIME NOT NULL, userTypeId INTEGER NOT NULL ССЫЛКИ userTypes (id) НА УДАЛИТЬ КАСКАД НА ОБНОВЛЕНИЕ КАСКАД);

Даже если я поставлю только строку, внешний ключ создается в SQL

UserType.hasMany(UserModel, { foreignKey: { allowNull : false }, onDelete: "CASCADE" })

Я прочитал hasOne doc / выпуск . В выпуске github говорится, что документ должен быть обновлен (@ 2014). Так что же делает текущая hasOne ассоциация?

Еще одна вещь, я знаю, что для получения связанных моделей требуется двусторонняя ассоциация ссылка , но мне не нужна обратная ассоциация, такая как выборка всех user с учетом их status, поэтому я объявляю только одностороннюю ассоциацию.

...