Выберите родительскую модель с атрибутом дочерней модели и уничтожьте ее - sequelize / MySQL - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть модели User и VerifyToken с атрибутами token и user_id. Мне нужно выбрать пользователя, но со значением token (из tokens таблицы).

Я пытался:

 await models.User.destroy({
    hierarchy: true,

   where: {
    token: token
   }
});

Это модель пользователя:

const VerifyToken = require('./verifyToken');

module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
    password: DataTypes.STRING,
    email: DataTypes.STRING,

}, {
    tableName: 'users',
    //syncOnAssociation: true
    hierarchy: true
});

User.associate = function (models) {
    const {VerifyToken} = models;

    User.hasOne(VerifyToken, {
        onDelete: 'CASCADE'
    });
};

return User;
};

И VerifyToken модель:

const User = require('./user');

module.exports = (sequelize, DataTypes) => {
const VerifyToken = sequelize.define('VerifyToken', {

    user_id: DataTypes.INTEGER,
    token: DataTypes.STRING,

}, {
    tableName: 'verify_tokens',
    syncOnAssociation: true,
    hierarchy: true
});


  VerifyToken.associations = function (models) {
    const {User} = models;

    VerifyToken.belongsTo(User);
   };

    return VerifyToken;
};

Проблема в том, что я даже не знаю с чего начать. Я пытался с include:[{model: models.VerifyToken, where: {}}], но как использовать user_id, вызываемый из дочерней модели?

Я хочу выбрать пользователя (родительскую модель) со значением (токен в дочерней модели) и удалить это одним запросом.

1 Ответ

1 голос
/ 09 апреля 2020

Выражение проблемы, которое вы хотите, состоит в том, чтобы поддерживать join и delete в одной операции сиквелизации.

Я хочу выбрать пользователя (родительскую модель) со значением (токен в дочерняя модель) и удалите его одним запросом.

В последующей документации Model.destroy не имеет include в свойстве options.

Таким образом, единственный оставленный вариант - это выбрать user_id из VerifyToken модели, а затем вызвать уничтожение для User модели, где id in user_id получено из VerifyToken.

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

const verifyTokens = await VerifyToken.findAll({
   where: {
       token: {
           [Sequelize.Op.In] : YOUR_TOKENS_FOR_WHICH_YOU_WANT_TO_DELETE_YOUR_USER
       }
   }
}

const userIdsToDestroy = verifyTokens.map(verifyToken => verifyToken.user_id)
await User.destroy({
    where: {
        id: {
            [Sequelize.Op.in] : userIdsToDestroy
        }
    }
}
...