多くの問題があります。少しずつ対処していきます。
1)モデル デフォルトでは、primaryKey
を宣言しない場合 、次にsequelizeは自動的にid
を追加します あなたのためのコラム。したがって、legId
有用な列ではありません。
さらに、モデルを関連付ける場合、foreignKey
参照が追加されるため、pawId
宣言すべきではありません。
したがって、Legs.js
次のように変更する必要があります:
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
}
2)アソシエーション
次の関連付けは意味がなく、すべき エラーの原因:
Leg.hasOne(Paw)
Paw.hasMany(Leg)
Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs
各Leg
1つのPaw
が必要です 、したがって、次のことをお勧めします:
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)外部キー
Leg.belongsTo(models.Cat, {
foreignKey: 'catId', // this should match
onDelete: 'CASCADE'
})
Cat.hasMany(models.Leg, {
foreignKey: 'catId', // this should match
as: 'legs'
})
4)積極的な読み込み
ネストされた関連付けを積極的に読み込む場合は、include
する必要があります 彼ら。 as
も使用する必要があります モデルの関連付けに一致するエイリアス:
Cat.findAll({
include: [{
model: Leg,
as: 'legs', // Cat.legs
include: [{
model: Paw,
as: 'paw' // Leg.paw instead of Leg.pawId
}]
}]
})
このセットアップ全体と上記のクエリを使用して、次のようになります。
[
{
"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
}
}
]
}
]
追加
これは明らかに練習用の設定であるため、Paw
を変更できます。 belongsToMany
になる 次のような関係(おそらくあなたは足で猫を結合しましたか?):
Paw.associate = function (models) {
Paw.belongsToMany(models.Leg, {
foreignKey: 'pawId',
through: 'PawLegs // a through join table MUST be defined
})
}
これは、最初に試したことを実装する正しい方法です
Leg.hasOne(paw)
paw.hasMany(leg)