Problémů je mnoho. Pokusím se je řešit postupně.
1) Modely Ve výchozím nastavení, pokud nedeklarujete primaryKey
, pak sequelize automaticky přidá id
sloupec pro vás. Tedy legId
není užitečný sloupec.
Pokud navíc přiřadíte model, foreignKey
reference je přidána za vás, tedy pawId
by neměl být deklarován.
Tedy Legs.js
by měl být upraven na:
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
}
Výše uvedené mi poskytuje následující sloupce v pgAdmin
:
2) Přidružení
Následující přidružení nedává smysl a mělo by způsobit chybu:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Každá Leg
by měl mít jednu Paw
, a proto navrhuji následující:
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) Cizí klíče
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Dychtivé načítání
Když dychtivě načítáte vnořená přidružení, musíte include
jim. Měli byste také použít as
alias, který odpovídá vašim přidružením k modelu:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Pomocí celého tohoto nastavení a výše uvedeného dotazu získám:
[
{
"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
}
}
]
}
]
Navíc
Protože se zjevně jedná o cvičné nastavení, můžete upravit Paw
být belongsToMany
vztah (možná máte spojené kočky za tlapu?) takto:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Toto by byl správný způsob, jak implementovat to, o co jste se původně pokoušeli
Leg.hasOne(paw)
paw.hasMany(leg)