Il y a de nombreux problèmes. Je vais essayer de les aborder progressivement.
1) Modèles Par défaut, si vous ne déclarez pas de primaryKey , puis sequelize ajoute automatiquement un id colonne pour vous. Ainsi legId n'est pas une colonne utile.
De plus, si vous associez un modèle, le foreignKey la référence est ajoutée pour vous, donc pawId ne doit pas être déclaré.
Ainsi Legs.js doit être modifié en :
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
}
Ce qui précède me donne les colonnes suivantes dans pgAdmin :
2) Associations
L'association suivante n'a pas de sens et devrait provoquer une erreur :
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Chaque Leg devrait avoir une Paw , et donc je suggère ce qui suit :
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) Clés étrangères
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Chargement impatient
Lors du chargement rapide d'associations imbriquées, vous devez include leur. Vous devez également utiliser as alias correspondant à vos associations de modèles :
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
En utilisant toute cette configuration et la requête ci-dessus, j'obtiens :
[
{
"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
Comme il s'agit évidemment d'une configuration d'entraînement, vous pouvez modifier Paw être un belongsToMany relation (peut-être avez-vous des chats siamois par la patte ?) comme suit :
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Ce serait la bonne façon d'implémenter ce que vous avez initialement essayé avec
Leg.hasOne(paw)
paw.hasMany(leg)