【问题标题】:How to use belongsToMany in Sequelize?如何在 Sequelize 中使用 belongsToMany?
【发布时间】:2017-07-08 04:24:47
【问题描述】:

我正在创建一个使用 sequelize 连接到 postgres 数据库的网络应用程序。我已经成功地自学了如何使用 hasMany 和 belongsTo 来调用、创建和销毁数据。我遇到了 belongsToMany 的问题。

在我的服务器中,我正在尝试创建一个属于ToMany 用户的行程作为骑手,并添加了一个与用户belongToMany Trip 的关联作为骑手。我希望能够根据 POST 请求创建行程,但不知道如何调用 Id。

///// 模型 trip.js

module.exports = function(sequelize, DataTypes) {
  var Trip = sequelize.define("Trip", {
    driverStart: DataTypes.STRING,
    driverEnd: DataTypes.STRING,
    riderStarts: DataTypes.ARRAY(DataTypes.STRING),
    riderEnds: DataTypes.ARRAY(DataTypes.STRING),
    tripDate: DataTypes.DATE,
    tripHour: DataTypes.INTEGER,
    availableSeats: DataTypes.INTEGER,
    price: DataTypes.INTEGER,
    tripIsActive: DataTypes.BOOLEAN
  });
  Trip.associate = function(models) {
    Trip.hasMany(models.User, {
      through: "riders_on_trip",
      as: "riders",
      onDelete: "CASCADE",
      foreignKey: "riderIds"
    });
    Trip.belongsTo(models.User, {
      as: "driver",
      onDelete: "CASCADE",
      foreignKey: "driverId"
    });
  };
  return Trip;
};

user.js

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define("User", {
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    profileImgUrl: DataTypes.STRING,
    fName: DataTypes.STRING,
    lName: DataTypes.STRING,
    yearOfBirth: DataTypes.INTEGER,
    gender: DataTypes.STRING,
    ratings: {
      type: DataTypes.ARRAY(DataTypes.INTEGER),
      defaultValue: [5]
    },
    onTrip: {
      type: DataTypes.BOOLEAN,
      defaultValue: false
    },
    createdAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.literal('NOW()')
    },
    updatedAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.literal('NOW()')
    }
  });
  User.associate = function(models) {
    User.hasMany(models.RideRequest, {
      onDelete: "CASCADE",
      foreignKey: "riderId"
    });
    User.hasMany(models.DriveRequest, {
      onDelete: "CASCADE",
      foreignKey: "driverId"
    });
    User.hasMany(models.Notification, {
      as: 'sender',
      onDelete: "CASCADE",
      foreignKey: "senderId"
    });
    User.hasMany(models.Notification, {
      as: 'receiver',
      onDelete: "CASCADE",
      foreignKey: "receiverId"
    });
    User.belongsToMany(models.Trip, {
      as: "riders",
      through: "riders_on_trip",
      onDelete: "CASCADE",
      foreignKey: "riderIds"
    });
    User.hasMany(models.Trip, {
      as: "driver",
      onDelete: "CASCADE",
      foreignKey: "driverId"
    });
  };
  return User;
};

///// 控制器

trip.js

  create: function create(req,res) {
    // var decodedIds = req.params.riderIds.split("-");
    var decoded = jwt.decode(req.query.token);
    // console.log(decodedIds + '------------------ DECODED IDS ----------------');
    model.User.set
    return model.Trip.create({
      driverStart: req.body.driverStart,
      driverEnd: req.body.driverEnd,
      riderStarts: req.body.riderStarts,
      riderEnds: req.body.riderEnds,
      tripDate: req.body.tripDate,
      tripHour: req.body.tripHour,
      availableSeats: req.body.availableSeats,
      price: req.body.price,
      tripIsActive: req.body.tripIsActive,
      driverId: req.params.driverId,
      riders: [{riderIds: 2}, {riderIds: 2}, {riderIds: 3}]
    }).then(function (trip) {
      console.log(trip.riderIds + '------------ RIDER IDS ---------------');
      return res.status(201).json({
        message: 'Trip created successfully',
        obj: trip
      });
    }).catch(function (err) {
      return res.status(400).json({
        title: 'Error occured while creating trip',
        error: err
      });
    });
  },

有没有哪位编程高手可以给我简要解释一下如何在 sequelize 中创建具有这种关联的旅行?

【问题讨论】:

    标签: javascript node.js postgresql http sequelize.js


    【解决方案1】:

    如果您要设置多对多表,则不需要 Trip 和 User 上的 hasMany、belongsTo 内容。看起来您正确设置了多对多表,但如果您需要查询属于特定用户的行程,则需要添加另一个关联

    Trip.belongsToMany(models.User, {
      as: "driver",
      through: "riders_on_trip",
    });
    

    你明白要点了。

    您可以像这样获取骑手 ID:

    trip.getRiders().then(function (rider){
        return riders.map((rider) => {
            return rider.id;
        });
    )};
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2017-08-15
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多