Ci sono molti problemi. Proverò ad affrontarli in modo incrementale.
1) Modelli Per impostazione predefinita, se non dichiari una primaryKey
, quindi sequelize aggiunge automaticamente un id
colonna per te. Quindi legId
non è una colonna utile.
Inoltre, se associ un modello, la foreignKey
il riferimento viene aggiunto per te, quindi pawId
non deve essere dichiarato.
Quindi Legs.js
dovrebbe essere modificato in:
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
}
Quanto sopra mi dà le seguenti colonne in pgAdmin
:
2) Associazioni
La seguente associazione non ha senso e dovrebbe causare un errore:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Ogni Leg
dovrebbe avere una Paw
, e quindi suggerisco quanto segue:
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) Chiavi esterne
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Caricamento ansioso
Quando si caricano associazioni nidificate desiderose, è necessario include
loro. Dovresti anche usare as
alias che corrisponde alle tue associazioni di modelli:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Utilizzando l'intera configurazione e la query precedente, ottengo:
[
{
"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
}
}
]
}
]
Extra
Poiché questa è ovviamente una configurazione pratica, puoi modificare Paw
essere un belongsToMany
relazione (forse hai dei gatti siamesi per la zampa?) come segue:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Questo sarebbe il modo corretto per implementare ciò che hai provato inizialmente con
Leg.hasOne(paw)
paw.hasMany(leg)