Có rất nhiều vấn đề. Tôi sẽ cố gắng giải quyết từng bước một.
1) Mô hình Theo mặc định, nếu bạn không khai báo primaryKey
, sau đó phần tiếp theo tự động thêm một id
cột dành cho bạn. Vì vậy, legId
không phải là một cột hữu ích.
Hơn nữa, nếu bạn liên kết một mô hình, thì foreignKey
tham chiếu được thêm cho bạn, do đó pawId
không nên khai báo.
Vì vậy, Legs.js
nên được sửa đổi thành:
module.exports = (sequelize, DataTypes) => {
var Leg = sequelize.define('Leg', {
originalValue: DataTypes.JSON,
newValue: DataTypes.JSON,
objectId: DataTypes.INTEGER // not entirely sure what this is
})
Leg.associate = function (models) {
// associations
}
return Leg
}
Phần trên cung cấp cho tôi các cột sau trong pgAdmin
:
2) Hiệp hội
Liên kết sau không có ý nghĩa và nên gây ra lỗi:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Mỗi Leg
nên có một Paw
và do đó tôi đề xuất những điều sau:
Leg.associate = function (models) {
// Leg.belongsTo(models.Cat)
Leg.hasOne(models.Paw, {
foreignKey: 'pawId',
as: 'paw'
})
}
Paw.associate = function (models) {
Paw.belongsTo(models.Leg, {
as: 'leg' // note this changed to make more sense
foreignKey: 'pawId'
})
}
3) Phím ngoại
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Đang tải háo hức
Khi háo hức tải các liên kết lồng nhau, bạn phải include
họ. Bạn cũng nên sử dụng as
bí danh phù hợp với liên kết mô hình của bạn:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Sử dụng toàn bộ thiết lập này và truy vấn ở trên, tôi nhận được:
[
{
"id": 1,
"userId": "1",
"createdAt": "2018-04-15T11:22:59.888Z",
"updatedAt": "2018-04-15T11:22:59.888Z",
"legs": [
{
"id": 1,
"originalValue": null,
"newValue": null,
"objectId": null,
"createdAt": "2018-04-15T11:22:59.901Z",
"updatedAt": "2018-04-15T11:22:59.901Z",
"catId": 1,
"paw": {
"id": 1,
"pawType": null,
"createdAt": "2018-04-15T11:22:59.906Z",
"updatedAt": "2018-04-15T11:22:59.906Z",
"pawId": 1
}
}
]
}
]
Thêm
Bởi vì đây rõ ràng là một thiết lập thực hành, bạn có thể sửa đổi Paw
trở thành một belongsToMany
mối quan hệ (có lẽ bạn có những con mèo dính liền bởi bàn chân?) như sau:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Đây sẽ là cách chính xác để triển khai những gì bạn đã cố gắng ban đầu
Leg.hasOne(paw)
paw.hasMany(leg)