2016-04-04 17 views
7

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ể.

Trả lời

3

tuyên bố bảng đường giao nhau như lớp riêng biệt, một cái gì đó như thế này

var UserLocation = sequelize.define('UserLocation', { 
    //you can define additional junction props here 
}); 

User.belongsToMany(Location, {through: 'UserLocation', foreignKey: 'user_id'}); 
Location.belongsToMany(User, {through: 'UserLocation', foreignKey: 'location_id'}); 

sau đó bạn có thể truy vấn bảng đường giao nhau giống như bất kỳ mô hình khác.

+0

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

+0

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

+0

Đ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