Es gibt viele Probleme. Ich werde versuchen, sie schrittweise anzugehen.
1) Modelle Standardmäßig, wenn Sie keinen primaryKey
deklarieren , dann fügt sequelize automatisch eine id
hinzu Spalte für Sie. Also legId
ist keine nützliche Spalte.
Außerdem, wenn Sie ein Modell zuordnen, der foreignKey
Referenz wird für Sie hinzugefügt, also pawId
sollte nicht deklariert werden.
Also Legs.js
sollte geändert werden 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
}
Das Obige gibt mir die folgenden Spalten in pgAdmin
:
2) Verbände
Die folgende Assoziation ergibt keinen Sinn und sollte einen Fehler verursachen:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Jedes Leg
sollte eine Paw
haben , und daher schlage ich Folgendes vor:
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) Fremdschlüssel
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Eifriges Laden
Wenn Sie verschachtelte Assoziationen eifrig laden, müssen Sie include
Sie. Sie sollten auch as
verwenden Alias, der Ihren Modellzuordnungen entspricht:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Unter Verwendung dieses gesamten Setups und der obigen Abfrage erhalte ich:
[
{
"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
Da dies offensichtlich ein Übungsaufbau ist, könnten Sie Paw
ändern ein belongsToMany
sein Beziehung (vielleicht haben Sie Katzen an der Pfote verbunden?) wie folgt:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Dies wäre der richtige Weg, um das zu implementieren, was Sie ursprünglich mit
versucht habenLeg.hasOne(paw)
paw.hasMany(leg)