Det finns många frågor. Jag ska försöka ta itu med dem stegvis.
1) Modeller Som standard, om du inte deklarerar en primaryKey
, sedan lägger sequelize automatiskt till ett id
kolumn för dig. Alltså legId
är inte en användbar kolumn.
Dessutom, om du associerar en modell, foreignKey
referens läggs till för dig, alltså pawId
bör inte deklareras.
Alltså Legs.js
bör ändras till:
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
}
Ovanstående ger mig följande kolumner i pgAdmin
:
2) Föreningar
Följande koppling är inte vettig, och bör orsaka ett fel:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Varje Leg
bör ha en Paw
, och därför föreslår jag följande:
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) Främmande nycklar
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Ivrig laddning
När du ivrig laddar kapslade associationer måste du include
dem. Du bör också använda as
alias som matchar dina modellassociationer:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Genom att använda hela den här installationen och ovanstående fråga får jag:
[
{
"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
Eftersom detta uppenbarligen är en övningsinställning kan du ändra Paw
att vara en belongsToMany
förhållande (du kanske har sammanfogade katter vid tass?) enligt följande:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Detta skulle vara det korrekta sättet att implementera det du först försökte med
Leg.hasOne(paw)
paw.hasMany(leg)