Ada banyak masalah. Saya akan mencoba mengatasinya secara bertahap.
1) Model Secara default, jika Anda tidak mendeklarasikan primaryKey
, kemudian sekuel secara otomatis menambahkan id
kolom untuk Anda. Jadi legId
bukan kolom yang berguna.
Selanjutnya, jika Anda mengaitkan model, foreignKey
referensi ditambahkan untuk Anda, jadi pawId
tidak boleh dideklarasikan.
Jadi Legs.js
harus diubah menjadi:
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
}
Di atas memberi saya kolom berikut di pgAdmin
:
2) Asosiasi
Asosiasi berikut tidak masuk akal, dan seharusnya menyebabkan kesalahan:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
Setiap Leg
harus memiliki satu Paw
, dan dengan demikian saya menyarankan yang berikut:
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) Kunci Asing
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4) Bersemangat Memuat
Saat ingin memuat asosiasi bersarang, Anda harus include
mereka. Anda juga harus menggunakan as
alias yang cocok dengan asosiasi model Anda:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
Dengan menggunakan seluruh penyiapan ini dan kueri di atas, saya memperoleh:
[
{
"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
}
}
]
}
]
Ekstra
Karena ini jelas merupakan pengaturan latihan, Anda dapat memodifikasi Paw
menjadi belongsToMany
hubungan (mungkin Anda memiliki kucing siam dengan cakarnya?) sebagai berikut:
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
Ini akan menjadi cara yang benar untuk menerapkan apa yang awalnya Anda coba dengan
Leg.hasOne(paw)
paw.hasMany(leg)