2017-07-08 12 views
0

Ich erstelle eine Web-App mit Sequelize, um eine Verbindung zu einer Postgres-Datenbank herzustellen. Ich habe es mir selbst beigebracht, wie man hasMany und androsesTo benutzt, um Daten aufzurufen, zu erstellen und zu vernichten. Ich habe Probleme mit "goesToMany".Wie benutzt man "goesToMany" in Sequelize?

In meinem Server versuche ich eine Reise zu erstellen, die zu vielen Benutzern als Fahrer gehört und eine Assoziation für Benutzer gehörige zu meiner Reise hinzufügt. Ich möchte in der Lage sein, eine Reise bei einer POST-Anfrage zu erstellen, kann aber nicht herausfinden, wie ich die IDs aufrufen soll.

///// MODELS 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; 
}; 

///// Controller

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 
     }); 
    }); 
    }, 

Gibt es irgendwelche maste Programmieren, wer könnte mir eine kurze Erklärung geben, wie ich eine Reise mit dieser Art von Assoziation in Sequelize schaffen könnte?

Antwort

0

Sie brauchen nicht die hasMany, belongsTo Sachen auf Trip und User, wenn Sie eine viele zu viele Tabelle einrichten. es sieht aus wie Sie die vielen zu vielen Tabelle richtig eingerichtet ist, aber wenn Sie die Fahrten abfragen müssen, die Sie zu einem bestimmten Benutzer gehören, wird ein weiterer Verein

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

Sie den Kern erhalten hinzufügen müssen.

können Sie die Reiter ids wie diese:

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