Hãy xem xét các mô hình sau:Query ngã ba bảng mà không nhận được cả hai hiệp hội trong Sequelize
var User = sequelize.define('User', {
_id:{
type: Datatypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
name: Datatypes.STRING,
email:{
type: Datatypes.STRING,
unique: {
msg: 'Email Taken'
},
validate: {
isEmail: true
}
}
});
var Location= sequelize.define('Location', {
_id:{
type: Datatypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
name: Datatypes.STRING,
address: type: Datatypes.STRING
});
Location.belongsToMany(User, {through: 'UserLocation'});
User.belongsToMany(Location, {through: 'UserLocation'});
Có cách nào để truy vấn bảng UserLocation
cho một cụ thể UserId
và nhận được Locations
tương ứng. Một cái gì đó như:
SELECT * FROM Locations AS l INNER JOIN UserLocation AS ul ON ul.LocationId = l._id WHERE ul.UserId = 8
Từ những gì tôi có thể tìm thấy bạn có thể làm điều gì đó tương tự như:
Location.findAll({
include: [{
model: User,
where: {
_id: req.user._id
}
}]
}).then(loc => {
console.log(loc);
});
Tuy nhiên, điều này sẽ trả về Locations
, UserLocation
nút giao thông, và User
mà nó được tham gia bảng User
khi tôi không cần bất kỳ thông tin người dùng nào và tôi chỉ cần Locations
cho người dùng đó. Những gì tôi đã làm là làm việc, tuy nhiên, truy vấn đối với bảng nối được ưu tiên thay vì tra cứu trên bảng User
.
Tôi hy vọng điều này là rõ ràng. Cảm ơn trước.
Sửa
Tôi thực sự đã kết thúc thực hiện điều này theo một cách khác. Tuy nhiên, tôi vẫn sẽ để lại điều này như một câu hỏi bởi vì điều này nên có thể.
Bạn có thể cung cấp cách bạn sẽ sử dụng bảng 'UserLocation' để tạo chính xác truy vấn mà OP đang hỏi không? Cảm ơn. – alecxe
Tôi không thể thử nó ngay bây giờ vì tôi đã không sống dự án sequelize ở đây. Nhưng tôi khá chắc chắn rằng bạn có thể sử dụng bảng nối như bất kỳ bảng nào khác mà không làm hại đến định nghĩa quan hệ. Trong trường hợp xấu nhất bạn có thể daclare cột chính nước ngoài trên UserLocation một cách rõ ràng, nhưng tôi đoán họ được xác định trên lớp bằng cách sequelized. (Tương tự như cột id, được khai báo tự động, nhưng nếu bạn redeclare nó rõ ràng nothihng xảy ra) Và sau đó bạn sẽ có thể sử dụng UserLocation như khóa ngoài cơ bản và xây dựng truy vấn theo cùng một cách. – farincz
Điều này vẫn không cho phép bạn tham gia một trong các tổ chức liên kết với bảng giao lộ mà không có tổ chức liên kết khác. – jony89