Sequelize: невозможно установить ссылку на две разные таблицы после миграции - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь установить ссылку из таблицы donlist на таблицу пользователей и таблицу requestblood. Несмотря на то, что столбцы ссылок (userid, requestbloodid) добавляются в таблицу, не удается вставить ссылочный идентификатор 'requestbloodid' в столбец и установить для него значение NULL.

Я использую

  • Nodejs
  • mysql: 2.16.0 v
  • продолжение: 4.37.10 v

файл модели user.js:

const moment = require('moment');

module.exports = (sequelize, DataTypes) => {
const user = sequelize.define(
'user',
 {
  id: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false,
    defaultValue: DataTypes.UUIDV4,
  },
  fullname: {
    type: DataTypes.STRING(20),
    allowNull: false,       
  },
  gender: { type: DataTypes.CHAR(1), allowNull: false },
  latitude: {
    type: DataTypes.DECIMAL(20, 15),
    allowNull: false,
    validate: { min: -90, max: 90 },
  },
  longitude: {
    type: DataTypes.DECIMAL(20, 15),
    allowNull: false,
    validate: { min: -180, max: 180 },
  },
  email: {
    type: DataTypes.STRING(50),
    allowNull: true,
  },
  isglobalcontactshared: { type: DataTypes.BOOLEAN, defaultValue: false },
  createdAt: {
    type: DataTypes.DATE,
    get() {
      return moment.utc(new Date(), 'DD-MMM-YYYY h:mm a').format('DD-MMM-YYYY h:mm a');
    },
  },
  updatedAt: {
    type: DataTypes.DATE,
    defaultValue: null,
   },
 },

 {
   freezeTableName: true,
 }
);

user.associate = function(models) {
user.belongsTo(models.contactdetails, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: {
    name: 'contactdetailid',
    allowNull: false,
    foreignKeyConstraint: true,
  },
 });
};
 return user;
};

файл requestblood.js:

const moment = require('moment');

module.exports = (sequelize, DataTypes) => {
const requestblood = sequelize.define(
'requestblood',
 {
   id: {
     type: DataTypes.UUID,
     primaryKey: true,
     allowNull: false,
     defaultValue: DataTypes.UUIDV4,
  },
  requestid: {
    type: DataTypes.STRING(10),
    allowNull: false,
  },
  latitude: {
    type: DataTypes.DECIMAL(20, 15),
    allowNull: false,
    validate: { min: -90, max: 90 },
  },
  longitude: {
    type: DataTypes.DECIMAL(20, 15),
    allowNull: false,
    validate: { min: -180, max: 180 },
  },
  locality: { type: DataTypes.STRING(20), allowNull: false },
  city: { type: DataTypes.STRING, allowNull: false },
  bloodtype: {
    type: DataTypes.INTEGER,
    allowNull: false,
    isNumeric: true,
    validate: { min: 1, max: 9 },
  },
  duedate: {
    type: DataTypes.DATEONLY,
    allowNull: false,
    get() {
      return moment.utc(this.getDataValue('duedate')).format('DD-MMM-YYYY');
    },
  },
  unitsrequired: { type: DataTypes.INTEGER, isNumeric: true },
  description: { type: DataTypes.STRING(500) },
  requeststateid: { type: DataTypes.STRING, allowNull: false },
  createdAt: {
    type: DataTypes.DATE,
    get() {
      return moment.utc(new Date(), 'DD-MMM-YYYY h:mm a').format('DD-MMM-YYYY h:mm a');
    },
  },
  updatedAt: {
    type: DataTypes.DATE,
    defaultValue: null,
  },
},
{
  freezeTableName: true,
}
);

requestblood.associate = function(models) {
requestblood.belongsTo(models.contactdetails, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: {
    name: 'contactdetailid',
    allowNull: false,
    foreignKeyConstraint: true,
  },
 });
};

/* requestblood.associate = function(models) {
requestblood.hasMany(models.donorslist, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: {
    name: 'requestbloodid',
    allowNull: false,
    foreignKeyConstraint: true,
  },
});
}; */

return requestblood;
};

donlist.js file

const moment = require('moment');

module.exports = (sequelize, DataTypes) => {
const donorslist = sequelize.define(
 'donorslist',
 {
  id: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false,
    defaultValue: DataTypes.UUIDV4,
  },
  fullname: {
    type: DataTypes.STRING(20),
    allowNull: false,
  },
  bloodgroup: { type: DataTypes.INTEGER, allowNull: false },
  contactnumber: { type: DataTypes.STRING(13), allowNull: true },
  willdonate: { type: DataTypes.BOOLEAN, defaultValue: false },
  hasdonated: { type: DataTypes.BOOLEAN, defaultValue: false },
  createdAt: {
    type: DataTypes.DATE,
    get() {
      return moment.utc(new Date(), 'DD-MMM-YYYY h:mm a').format('DD-MMM-YYYY h:mm a');
    },
  },
  updatedAt: {
    type: DataTypes.DATE,
    defaultValue: null,
  },
},
{
  freezeTableName: true,
 }
);

donorslist.associate = function(models) {
 donorslist.belongsTo(models.requestblood, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: {
    name: 'requestbloodid',
    allowNull: false,
    foreignKeyConstraint: true,
  },
});
};

donorslist.associate = function(models) {
donorslist.belongsTo(models.user, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: {
    name: 'userid',
    allowNull: false,
    foreignKeyConstraint: true,
   },
  });
};

return donorslist;
};

Когда приведенный ниже код выполняется,

models.donorslist
.create({
  fullname,
  bloodgroup: bloodgrp,
  contactnumber: contnum,
  willdonate: req.body.willdonate,
  userid: usrid,
  requestbloodid: reqid,
  updatedAt: null,
 })

` возвращает запрос как:

INSERT INTO `donorslist` (`id`,`fullname`,`bloodgroup`,`contactnumber`,`willdonate`,`hasdonated`,`createdAt`,`updatedAt`,`userid`) VALUES ('687888be-4381-460f-af62-46365a16fb40','sunil',4,'+123456789',true,false,'2019-01-10 07:00:12','2019-01-10 07:00:12','b93cfd73-a6ea-4825-91ad-8ded37418ca7');

Обратите внимание на отсутствующий столбец requestbloodid. Это как-то пропускает столбец requestbloodid. Я сталкиваюсь с этой проблемой после выполнения миграций. Это работало нормально с sequelize.sync (). Если я раскомментирую приведенный ниже код в файле requestblood.js, то referenceid 'contactdetailid' таблицы requestblood будет установлен в NULL. Таким образом, я не могу сделать ссылку на ownTo и hasMany из этих двух таблиц.

requestblood.associate = function(models) {
requestblood.hasMany(models.donorslist, {
  onDelete: 'CASCADE',
  hooks: true,
  foreignKey: {
    name: 'requestbloodid',
    allowNull: false,
    foreignKeyConstraint: true,
  },
});
};
...