【问题标题】:Create model with its association in sequelize在 sequelize 中创建模型及其关联
【发布时间】:2016-11-02 23:19:24
【问题描述】:

我正在使用 sequelize 作为我的 nodejs 网络应用 ORM。
我有 2 个模型,OfferGame。它们之间存在1:1的关联,我正在考虑如何实现。
首先,我尝试使用Offer.belongsTo(Game),以便GameId 驻留在Offer 模型中。当我创建 Offer 时,我希望也创建 Game

我已将关联设置如下:

Offer.belongsTo(models.Game, {
      foreignKey: {
        allowNull: false
      }
    })

这样GameId 将永远不会为空。在sequelizedocs 中,注意到我可以像这样创建GameOffer

models.Offer.create({Game:{"name":"The Last of Us", "platform":"PC"}},{include:[models.Game]});

但我得到了:

Unhandled rejection SequelizeDatabaseError: null value in column "GameId" violates not-null constraint

如何使用非空约束在 1 个操作中创建 OfferGame

编辑:

module.exports = function(sequelize, DataTypes) {
  var Game = sequelize.define("Game", {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    platform: {
      type: DataTypes.ENUM('PC', 'PS4', 'PS3', 'XB1', 'XB360'),
      allowNull: false
    },
    cover: {
      type: DataTypes.STRING,
      allowNull: false,
      validate: {
        notEmpty: true
      }
    }
  }, {
    updatedAt: false,
    createdAt: false
  });

  return Game;
};

module.exports = function(sequelize, DataTypes) {
  var Offer = sequelize.define("Offer", {
    price: {
      type: DataTypes.INTEGER,
      validate: {
        max: 999,
        min: 0
      }
    },
    exchange: {
      type: DataTypes.BOOLEAN,
      defaultValue: true,
      allowNull: false
    }
  }, {
    updatedAt: false,
    classMethods: {
      associate: function(models) {
        Offer.belongsTo(models.Game, {
          foreignKey: {
            allowNull: false
          }
        });
      }
    }
  });

  return Offer;
};

【问题讨论】:

标签: node.js sequelize.js


【解决方案1】:

您没有为 Offer 对象添加任何内容。你只是在传递Game 对象。

models.Offer.create({
    //set fields for 'Offer'
    Game:{"name":"The Last of Us", "platform":"PC"}
    },
    {include:[models.Game]}
);

此外,您只需在设置关联时定义foreignKey。约束定义驻留在模型中:

Offer.belongsTo(models.Game, {
      foreignKey: 'GameId'
    });

【讨论】:

  • Offer 有几个字段我确实省略了。不需要设置外键的名称,因为它是默认名称。
猜你喜欢
  • 2019-12-12
  • 2021-05-14
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多