Има много въпроси. Ще се опитам да им обърна внимание постепенно.
1) Модели По подразбиране, ако не декларирате primaryKey
, след което sequelize автоматично добавя id
колона за вас. Така legId
не е полезна колона.
Освен това, ако асоциирате модел, foreignKey
препратка се добавя за вас, следователно pawId
не трябва да се декларира.
Така Legs.js
трябва да се промени на:
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
}
Горното ми дава следните колони в pgAdmin
:
2) Асоциации
Следната връзка няма смисъл и трябва предизвика грешка:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Всеки Leg
трябва да има една Paw
и затова предлагам следното:
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) Чужди ключове
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Нетърпеливо зареждане
Когато нетърпеливо зареждате вложени асоциации, трябва да include
тях. Трябва също да използвате as
псевдоним, който съответства на асоциациите на вашия модел:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Използвайки цялата тази настройка и горната заявка, получавам:
[
{
"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
}
}
]
}
]
Екстра
Тъй като това очевидно е настройка за практика, можете да промените Paw
да бъде belongsToMany
връзка (може би сте свързали котки за лапата?), както следва:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Това би бил правилният начин да приложите това, с което първоначално се опитахте
Leg.hasOne(paw)
paw.hasMany(leg)