Er zijn veel problemen. Ik zal proberen ze stapsgewijs aan te pakken.
1) Modellen Standaard, als u geen primaryKey
. declareert , en sequelize voegt automatisch een id
toe kolom voor jou. Dus legId
is geen nuttige kolom.
Bovendien, als u een model koppelt, wordt de foreignKey
referentie is voor u toegevoegd, dus pawId
mag niet worden aangegeven.
Dus Legs.js
moet worden gewijzigd 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
}
Het bovenstaande geeft me de volgende kolommen in pgAdmin
:
2) Verenigingen
De volgende associatie is niet logisch en moet een fout veroorzaken:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Elke Leg
zou één Paw
. moeten hebben , en daarom stel ik het volgende voor:
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) Buitenlandse sleutels
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Bezig met laden
Bij het gretig laden van geneste associaties, moet je include
hen. Gebruik ook as
alias die overeenkomt met uw modelassociaties:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Met behulp van deze hele setup en de bovenstaande vraag, krijg ik:
[
{
"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
Omdat dit duidelijk een oefenopstelling is, zou je Paw
. kunnen aanpassen een belongsToMany
zijn relatie (misschien heb je Siamese katten bij de poot?) als volgt:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Dit zou de juiste manier zijn om te implementeren wat u aanvankelijk probeerde met
Leg.hasOne(paw)
paw.hasMany(leg)