Ассоциация «многие ко многим» самостоятельно - PullRequest
1 голос
/ 11 октября 2019

РЕДАКТИРОВАТЬ:

Я получил небольшой прогресс ... Я изменил отношение на:

 Survivor.associate = (models) => {
    Survivor.belongsToMany(models.Survivor, { through: models.InfectedsReports, as: 'Reporter', foreignKey: 'ReportedId' })
    Survivor.belongsToMany(models.Survivor, { through: models.InfectedsReports, as: 'Reported', foreignKey: 'ReporterId' })
  }

и теперь он показывает оба поля правильно, но ввставка значений равна нулю !!!

ОРИГИНАЛЬНЫЙ ВОПРОС:

У меня есть следующие таблицы:

Выжившие:

module.exports = {
  up: (queryInterface, DataTypes) => {
    return queryInterface.createTable('Survivors', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: {
        allowNull: false,
        type: DataTypes.STRING,
      },
      gender: {
        allowNull: false,
        type: DataTypes.ENUM,
        values: ['M', 'F']
      },
      isInfected: {
        allowNull: false,
        type: DataTypes.BOOLEAN,
        defaultValue: 0
      },
      latitude: {
        type: DataTypes.STRING,
        allowNull: true,
        defaultValue: null
     },
     longitude: {
        type: DataTypes.STRING,
        allowNull: true,
        defaultValue: null
     },
      createdAt: {
        allowNull: false,
        type: DataTypes.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: DataTypes.DATE,
      },
    })
  },

  down: (queryInterface) => {
    return queryInterface.dropTable('Survivors');
  }

};

Заражения, о которых сообщали другие выжившие:

module.exports = {
  up: (queryInterface, DataTypes) => {
    return queryInterface.createTable('InfectedsReports', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      ReporterId: {
        allowNull: false,
        type: DataTypes.INTEGER,
        references: {
          model: 'Survivors',
          key: 'id',
        }
      },
      ReportedId: {
        allowNull: false,
        type: DataTypes.INTEGER,
        references: {
          model: 'Survivors',
          key: 'id',
        }
      },
    });
  },

  down: (queryInterface) => {
    return queryInterface.dropTable('SurvivorsItems');
  }
};

И модели:

module.exports = (sequelize, DataTypes) => {
  const Survivor = sequelize.define('Survivor', {
    name: DataTypes.STRING,
    gender: {
      type: DataTypes.ENUM,
      values: ['M', 'F']
    },
    isInfected: DataTypes.BOOLEAN,
    latitude: DataTypes.STRING,
    longitude: DataTypes.STRING,
  });
  Survivor.associate = (models) => {
    Survivor.belongsToMany(models.Survivor, { through: 'InfectedsReports', as: 'Reporter', foreignKey: 'id' })
    Survivor.belongsToMany(models.Survivor, { through: 'InfectedsReports', as: 'Reported', foreignKey: 'id' })
  }
  return Survivor;

module.exports = (sequelize, DataTypes) => {
  const InfectedsReports = sequelize.define('InfectedsReports',{
    ReporterId: DataTypes.INTEGER,
    ReportedId: DataTypes.INTEGER,
  }, {
    timestamps: false,
  });
  return InfectedsReports;
}

У меня не было успеха при вставке, потому что ассоциация "многие ко многим":

Выполнение (по умолчанию): INSERT INTO InfectedsReports (id) VALUES (DEFAULT);Необработанное отклонение SequelizeForeignKeyConstraintError: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (zombieresistance. InfectedsReports, CONSTRAINT InfectedsReports_ibfk_1 FOREIGN KEY (ReporterId) ССЫЛКИ Survivors (id))

если я удаляю одно объявление ownToMany, появляется один файл, но не другой, а идентификатор во вставке оказывается равным нулю:

controller:

module.exports = {

  async create(req, res) {
    const { id, idReported } = req.params;

    try {

      const reporter = await Survivor.findByPk(id)
      const reported = await Survivor.findByPk(idReported)
      if (null === reported || null === reporter) {
        res.status(404).send('Survivor not found')
      }

      const report = InfectedsReports.create({ idReporter: id, idReported: idReported })
      res.send(report)

    } catch (e) {

      console.log(e)
      res.status(500).send(e)

    }
  },

}

Canкто-нибудь, помогите мне понять, как мне создать самоассоциацию в этой проблеме?

tks ...

1 Ответ

0 голосов
/ 11 октября 2019

РАЗРЕШЕНО:

это изменение - мат !!!

Survivor.associate = (models) => {
    Survivor.belongsToMany(models.Survivor, { through: models.InfectedsReports, as: 'Reporter', foreignKey: 'ReportedId' })
    Survivor.belongsToMany(models.Survivor, { through: models.InfectedsReports, as: 'Reported', foreignKey: 'ReporterId' })
}

Спасибо!

...