Existem muitos problemas. Vou tentar abordá-los de forma incremental.
1) Modelos Por padrão, se você não declarar uma
primaryKey
, o sequelize adiciona automaticamente um id
coluna para você. Assim, legId
não é uma coluna útil. Além disso, se você associar um modelo, a
foreignKey
referência é adicionada para você, portanto, pawId
não deve ser declarado. Assim,
Legs.js
deve ser modificado para: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
}
O acima me dá as seguintes colunas em
pgAdmin
:
2) Associações
A seguinte associação não faz sentido e deveria causar um erro:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Cada
Leg
deve ter uma Paw
, e assim sugiro o seguinte: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) Chaves estrangeiras
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Carregamento antecipado
Ao carregar associações aninhadas, você deve
include
eles. Você também deve usar as
alias que corresponda às suas associações de modelo:Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Usando toda essa configuração e a consulta acima, obtenho:
[
{
"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
}
}
]
}
]
Extras
Como esta é obviamente uma configuração prática, você pode modificar
Paw
ser um belongsToMany
relação (talvez você tenha gatos siameses pela pata?) da seguinte forma:Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Esta seria a maneira correta de implementar o que você tentou inicialmente com
Leg.hasOne(paw)
paw.hasMany(leg)