javascript - 如何在Sequelize中使用belongsToMany?

标签 javascript node.js postgresql http sequelize.js

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

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

/////楷模
旅行.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;
};

用户.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;
};

///// Controller

旅行.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 中用这种关联来创建旅行?

最佳答案

如果您要设置多对多表,则不需要 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;
    });
)};

关于javascript - 如何在Sequelize中使用belongsToMany?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44982462/

相关文章:

javascript - Instagram oAuth Authentication postMessage 问题仅适用于移动浏览器

javascript - 未从 ui 更改文本框值且无法显示

javascript - 在名称属性 Struts 中连接字符串

node.js - 使用 xml2js 解析

javascript - 返回 promise

python - 有没有办法在 Redshift 中使用 CONCAT(table_name(col1, col2, col3,.....)) 连接可变数量的列?

javascript - 如何增加javascript中的不透明度?

javascript - 如何使用 'request' 和 'async' 在 nodeJS 上收集 Web API 的结果

java - 将 Hibernate(3.2.5) 与 PostgreSQL(8.2) 一起使用时,对象不会被持久化

python - Django 唯一一起约束失败?