2016-06-28 20 views
5

Tôi đang mở rộng ứng dụng của tôi và tôi cần phải tham gia hai mô hình trước đây tôi đã tạo ra với Sequelize, họ như sau:Sequelize hasMany Tham gia hiệp hội

Meal

sequelize.define('meal', { 
    mealId: { 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    quantity: { 
     type: DataTypes.DECIMAL, 
     allowNull: false 
    }, 
    period: { 
     type: DataTypes.INTEGER, 
     allowNull: false 
    } 
}) 

Thực phẩm

sequelize.define('food', { 
    idFood: { 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    nameFood: { 
     type: DataTypes.STRING, 
     allowNull: false 
    } 
}) 

Tôi đã thêm mối quan hệ sau:

db.food.hasMany(db.meal, {as : 'Food', foreignKey : 'idFood'}); 

Dòng này cho biết thêm một cột idFood trên Meal

Nhanh chóng giải thích những gì đang xảy ra, Thực phẩm được một bảng với nhiều loại thực phẩm (duh) như bánh mì, gạo, Đậu vv Meal là một bảng xác định thực phẩm nào người dùng đã chọn với chi tiết của họ.

Do đó, hiểu biết của tôi là Meal có nhiều Thực phẩm (như tôi đã thêm trước đó) nhưng Thực phẩm không đòi hỏi bất kỳ mối quan hệ với Meal, vì nó chỉ chứa dữ liệu và không được thay đổi sau khi Tôi lần đầu tiên cư trú nó. Nhưng khi tôi đã cố gắng để tham gia cùng họ với:

db.meal.findAll({ include : [db.food] }).then(function (meals) { 
    console.log(JSON.stringify(meals)); 
}); 

Tôi đã nhận lỗi sau:

Unhandled rejection Error: food is not associated to meal! 

bất cứ ai có thể giải thích những gì tôi nên làm gì? Tôi nghĩ rằng nó có liên quan đến các mối quan hệ, nhưng tôi không thể tìm thấy trên tài liệu bất kỳ lời giải thích tốt nào về những gì tôi nên làm.

Cảm ơn bạn!

Chỉnh sửa: Đọc tài liệu (again), ví dụ có ý nghĩa, nhưng tôi không nghĩ rằng ví dụ này có thể áp dụng cho trường hợp của tôi, vì trên ví dụ của họ, Người dùng có Tác vụ và Tác vụ thuộc về Người dùng. Nhưng trong trường hợp của tôi, Thức ăn không thuộc về Bữa ăn, bởi vì nhiều Bữa ăn có thể có cùng Món ăn với số lượng khác nhau (hoặc cho những người dùng khác nhau).

Trả lời

6

Vấn đề là mối quan hệ phải được xác định theo cả hai cách. Hiện tại, Sequelize biết cách nhận được từ Food -> Meal vì

db.food.hasMany(db.meal, {as : 'Food', foreignKey : 'idFood'}); 

nhưng không biết cách thức nhận bữa ăn -> Thực phẩm.Đó là lý do tại sao bạn phải xác định mối quan hệ tương tự theo chiều ngược lại, như vậy:

db.meal.belongsTo(db.food, {foreignKey : 'idFood'}); 

này không thêm bất kỳ phím mới vì nó sẽ xác định meal.idFood mà bạn định nghĩa với tuyên bố đầu tiên của bạn rồi.

Bây giờ bạn sẽ có thể thực hiện

db.meal.findAll({ include : [db.food] }).then(function (meals) { 
    console.log(JSON.stringify(meals)); <-- each array element of meals should have an attribute `food` 
}); 
+0

Excelent! Điều này đã cho tôi kết quả tôi muốn, chỉ là một câu hỏi cuối cùng. Tôi đang in JSON.stringify (bữa ăn) và nó hiển thị mọi phần của dữ liệu, nhưng nếu tôi muốn tự mình truy cập một số giá trị tôi có thể làm được không? – leofontes

+0

Giống như truy cập vào mỗi thực phẩm? –

+0

Đừng bận tâm, tôi đã tìm ra, cảm ơn bạn rất nhiều! – leofontes

0

Nếu bạn đang sử dụng bí danh trên liên kết ({ as: 'Food' }), bạn cũng cần sử dụng bí danh đó trên tuyên bố bao gồm.

Vì vậy, nó muốn được như thế:

db.meal.findAll({ 
    include : [{ 
    model: db.food, 
    as: 'Food' 
    }] 
}).then(function (meals) { 
    console.log(JSON.stringify(meals)); 
}); 

If an association is aliased (using the as option), you must specify this alias when including the model. Notice how the user's Tools are aliased as Instruments above. In order to get that right you have to specify the model you want to load, as well as the alias

Thông tin thêm here.

+0

Tuy nhiên mang lại cho tôi những lỗi: Unhandled chối Lỗi: thực phẩm (thực phẩm) không liên quan đến bữa ăn! – leofontes

+0

Đọc tài liệu (một lần nữa), ví dụ này có ý nghĩa, nhưng tôi không nghĩ rằng ví dụ này có thể áp dụng cho tình huống của tôi, bởi vì trên ví dụ của họ, Người dùng có Nhiệm vụ và Nhiệm vụ thuộc về Người dùng. Nhưng trong trường hợp của tôi, Thức ăn không thuộc về Bữa ăn, bởi vì nhiều Bữa ăn có thể có cùng Món ăn với số lượng khác nhau (hoặc cho những người dùng khác nhau). Làm thế nào tôi có thể vượt qua điều đó? – leofontes

+0

@leofontes trong tình huống của bạn, bạn cần phải thực hiện mối quan hệ nhiều-nhiều, một bữa ăn có thể có nhiều thực phẩm, và một thực phẩm có thể được sử dụng trong nhiều bữa ăn, do đó có ý nghĩa. Làm theo tài liệu để thực hiện loại mối quan hệ này. –

Các vấn đề liên quan