簡體   English   中英

Sequelize - 插入新行時避免刪除多對多關聯的行

[英]Sequelize - avoid deleting rows of many-to-many association when inserting a new one

我的問題是,當我執行此代碼時:

const task = await db.tasks.findByPk(1)
const user = await db.users.findByPk(4)
await user.setTasks(task)

有時候是這樣的:

Executing (default): SELECT `tasks`.`id`, `tasks`.`start_date` FROM `tasks` AS `tasks` WHERE `tasks`.`id` = '1';
Executing (default): SELECT `id`, `name`, `surname`, `email`, `role` FROM `users` AS `users` WHERE `users`.`id` = '4';
Executing (default): SELECT `id`, `task_id`, `user_id` FROM `users_tasks` AS `users_tasks` WHERE `users_tasks`.`user_id` = 4;
Executing (default): DELETE FROM `users_tasks` WHERE `user_id` = 4 AND `task_id` IN (2)
Executing (default): INSERT INTO `users_tasks` (`id`,`task_id`,`user_id`) VALUES (NULL,1,4);

id 為 4 的用戶先前與 id 為 2 的任務有關聯。問題是,我想保留該關聯! 對於我的應用程序來說,將用戶分配到更多任務(反之亦然)是完全沒問題的。

我實際上會說這是多對多關系的正常期望行為......為什么users_tasks在添加新的之前刪除users_tasks上的行,我該如何防止這種情況發生?

這是我的用戶模型:

module.exports = function(sequelize, DataTypes) {
    var User = sequelize.define('users', {
        id: {
            type: DataTypes.INTEGER(10).UNSIGNED,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: DataTypes.STRING(50),
            allowNull: false
        },
        surname: {
            type: DataTypes.STRING(50),
            allowNull: false
        },
        email: {
            type: DataTypes.STRING(256),
            allowNull: false
        },
    }, {
        tableName: 'users',
        timestamps: false,
    })

    User.associate = function (models) {
        User.belongsToMany(models.tasks, {through: 'users_tasks', foreignKey: 'user_id'})
    }

    return User
}

這是我的任務模型:

module.exports = function(sequelize, DataTypes) {
    var Task = sequelize.define('tasks', {
        id: {
            type: DataTypes.INTEGER(10).UNSIGNED,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        start_date: {
            type: DataTypes.DATE,
            allowNull: true,
        },
    }, {
        tableName: 'tasks',
        timestamps: false
    })

    Task.associate = function (models) {
        Task.belongsToMany(models.users, {through: 'users_tasks', foreignKey: 'task_id'})
    }

    return Task
}

這是我的連接表:

module.exports = function(sequelize, DataTypes) {
    return sequelize.define('users_tasks', {
        id: {
            type: DataTypes.INTEGER(10).UNSIGNED,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        task_id: {
            type: DataTypes.INTEGER(10).UNSIGNED,
            allowNull: false,
            references: {
                model: 'tasks',
                key: 'id'
            }
        },
        user_id: {
            type: DataTypes.INTEGER(10).UNSIGNED,
            allowNull: false,
            references: {
                model: 'users',
                key: 'id'
            }
        }
    }, {
        tableName: 'users_tasks',
        timestamps: false
    })
}

我是否需要更改模型定義上的某些內容,或者我是否需要更改調用setTasks的方式? 否則,我需要做什么? 為什么 Sequelize 強制執行這種刪除以前存在的關聯的奇怪和不需要的行為?

我發現如果我想保持預先存在的關系,我應該使用add而不是set

因此,實現我想要的結果的正確方法是:

const task = await db.tasks.findByPk(1)
const user = await db.users.findByPk(4)
await user.addTasks(task)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM