ИЗБЕГАЙТЕ ДУБЛИКАТОВ в запросе на продолжение - PullRequest
0 голосов
/ 13 ноября 2018

Я внедряю подобную систему для проекта. И мне нужна помощь с запросом.

В основном у меня есть 2 кнопки (upvote и downvote), которые вызывают мою функцию и дают идентификатор потока, голосование по имени пользователя и голосование (1 или -1).

addPositiveorNegativeLikes = function(thread_id, username, vote) {

 sequelize.query('INSERT INTO Likes (thread_id, userId, vote, createdAt, updatedAt) 
 VALUES((?), (SELECT id FROM Users WHERE username=(?)), (?), (?), (?)) 
 ON DUPLICATE KEY UPDATE thread_id=(?), userId=(SELECT id FROM Users WHERE username=(?))',{

 replacements: [thread_id, username, vote, new Date(), new Date(), thread_id, username]
 }) 
}

Но теперь в моей таблице Likes althought thread_id и userId, оба первичных ключа, вставляет несколько повторных «Likes».

Как я могу изменить свой запрос, чтобы он удалял существующий голос и заменял его на новый ??

Вот моя модель Like:

'use strict';
module.exports = (sequelize, DataTypes) => {
const Like = sequelize.define('Like', {
  id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
  },
  userId: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.INTEGER
  },
  thread_id: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.INTEGER
  },
  createdAt: {
      allowNull: false,
      type: DataTypes.DATE
  },
  updatedAt: {
      allowNull: false,
      type: DataTypes.DATE
  },
  vote: {
      type: DataTypes.INTEGER
  }
}, {});
 Like.associate = function(models) {
 // associations can be defined here
 };
return Like;
};

1 Ответ

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

Здесь вы можете создать составной ключ с этим

userId: {
    allowNull: false,
    unique:"vote_user" // <------ HERE
    type: DataTypes.INTEGER
},
thread_id: {
    allowNull: false,
    unique:"vote_user" // <------ HERE
    type: DataTypes.INTEGER
},

ПРИМЕЧАНИЕ:

 // Creating two objects with the same value will throw an error. The unique property can be either a
 // boolean, or a string. If you provide the same string for multiple columns, they will form a
 // composite unique key.
 uniqueOne: { type: Sequelize.STRING,  unique: 'compositeIndex' },
 uniqueTwo: { type: Sequelize.INTEGER, unique: 'compositeIndex' },

А затем создайте его следующим образом:

Like.create({ userId : 1 , thread_id : 1 }).then(data => {
    // success
}).catch(err => {
    // error if same data exists
})
// <--- this will check that if there any entry with userId 1 and thread_id 1 , 
// if yes , then this will throw error
// if no then will create an entry for that

Примечание:

Никогда не запускайтеНеобработанный запрос, как вы делали в своем примере кода, всегда использует модель для выполнения CRUD, таким образом вы можете использовать все функции sequelizejs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...