Проблемы с реализацией программного удаления SequelizeJS - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь реализовать «мягкое удаление» в SequelizeJS. Итак, я поместил «paranoid: true» в моей модели и столбец «deleteAt» в миграции. Я пытался использовать ответ из другого вопроса, но он не работал из-за разных версий. Кроме того, я не уверен, правильно ли я написал свои контроллеры. В Интернете не так много информации, поэтому я не уверен, как проверить, правильно ли я это делаю. Я использую Sequelize 5.3.0. Вот моя модель:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Properties = sequelize.define('Properties', {
    name: {
      allowNull: false,
      type: DataTypes.STRING
    }
  }, {
    timestamps: true,
    paranoid: true
  });
  Properties.associate = function(models) {
    // associations can be defined here
    Properties.hasMany(models.Deals, {
      foreignKey: 'id',
      onDelete: 'CASCADE'
    })
  };
  return Properties;
};

Вот моя миграция:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Properties', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.INTEGER,
        autoIncrement: true
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING
      }
      deletedAt: {
        type: Sequelize.DATE
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Properties');
  }
};

Я нашел это решение из официальных документов, но оно не имеет смысла для меня:

User.findAll({
    include: [{
        model: Tool,
        where: { name: { [Op.like]: '%ooth%' } },
        paranoid: false // query and loads the soft deleted records
    }]
});

Мой контроллер getAllProperties:

getAllProperties: (req, res, next) => {
    return Properties
    .all()
    .then(properties => res.status(200).json({ status: 'Retrieved all properties', properties }))
    .catch(error => console.log(error));
  }

Мой контроллер destroyProperty:

destroyProperty: (req, res, next) => {
  const { id } = req.params;
  return Properties
  .findById(id)
  .then(property => {
    if (!property) {
      return res.status(404).send({ message: 'Property not found' })
    }
    return property
    .destroy()
    .then(() => res.status(200).json({ status: 'Deleted one property', property }))
    .catch(error => console.log(error));
  })
}

1 Ответ

0 голосов
/ 21 ноября 2018

Я понял, что мои модели и миграции были хорошими, дело в том, что я делал sequelize db:migrate:undo:all и sequelize db:migrate, но схема БД осталась прежней. Итак, я сделал sequelize db:drop и sequelize db:create, а затем он начал создавать это поле. Также я изменил свой контроллер getAllProperties:

getAllProperties: (req, res, next) => {
  return Properties
  .findAll({paranoid: false})
  .then(properties => res.status(200).json({ status: 'Retrieved all properties', properties }))
  .catch(error => console.log(error));
}

После того, как я все это изменил, он начал работать.

...