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)