Der er mange problemer. Jeg vil forsøge at behandle dem trinvist.
1) Modeller Som standard, hvis du ikke erklærer en primaryKey , derefter tilføjer sequelize automatisk et id kolonne til dig. Således legId er ikke en nyttig kolonne.
Desuden, hvis du tilknytter en model, foreignKey reference tilføjes til dig, således pawId bør ikke erklæres.
Således Legs.js skal ændres til:
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
}
Ovenstående giver mig følgende kolonner i pgAdmin :
2) Foreninger
Følgende tilknytning giver ikke mening, og bør forårsage en fejl:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Hvert Leg skal have én Paw , og derfor foreslår jeg følgende:
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) Fremmednøgler
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Ivrig indlæsning
Når du ivrig indlæser indlejrede associationer, skal du include dem. Du bør også bruge as alias, der matcher dine modeltilknytninger:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Ved at bruge hele denne opsætning og ovenstående forespørgsel får jeg:
[
{
"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
}
}
]
}
]
Ekstra
Fordi dette åbenbart er en øvelsesopsætning, kan du ændre Paw at være en belongsToMany forhold (måske har du sammenføjede katte ved poten?) som følger:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Dette ville være den korrekte måde at implementere det, du oprindeligt forsøgte med
Leg.hasOne(paw)
paw.hasMany(leg)