PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Assoziationen in Folge funktionieren nicht wie beabsichtigt

Es gibt viele Probleme. Ich werde versuchen, sie schrittweise anzugehen.

1) Modelle Standardmäßig, wenn Sie keinen primaryKey deklarieren , dann fügt sequelize automatisch eine id hinzu Spalte für Sie. Also legId ist keine nützliche Spalte.

Außerdem, wenn Sie ein Modell zuordnen, der foreignKey Referenz wird für Sie hinzugefügt, also pawId sollte nicht deklariert werden.

Also Legs.js sollte geändert werden in:

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
}

Das Obige gibt mir die folgenden Spalten in pgAdmin :

2) Verbände

Die folgende Assoziation ergibt keinen Sinn und sollte einen Fehler verursachen:

Leg.hasOne(Paw)
Paw.hasMany(Leg)

Unhandled rejection Error: Cyclic dependency found. Legs is dependent of itself.
Dependency chain: Legs -> Paws => Legs

Jedes Leg sollte eine Paw haben , und daher schlage ich Folgendes vor:

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) Fremdschlüssel

Leg.belongsTo(models.Cat, {
  foreignKey: 'catId', // this should match
  onDelete: 'CASCADE'
})

Cat.hasMany(models.Leg, {
  foreignKey: 'catId', // this should match
  as: 'legs'
})

4) Eifriges Laden

Wenn Sie verschachtelte Assoziationen eifrig laden, müssen Sie include Sie. Sie sollten auch as verwenden Alias, der Ihren Modellzuordnungen entspricht:

Cat.findAll({
  include: [{
    model: Leg,
    as: 'legs', // Cat.legs 
    include: [{
      model: Paw,
      as: 'paw' // Leg.paw instead of Leg.pawId
    }]
  }]
})

Unter Verwendung dieses gesamten Setups und der obigen Abfrage erhalte ich:

[
  {
    "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

Da dies offensichtlich ein Übungsaufbau ist, könnten Sie Paw ändern ein belongsToMany sein Beziehung (vielleicht haben Sie Katzen an der Pfote verbunden?) wie folgt:

Paw.associate = function (models) {
  Paw.belongsToMany(models.Leg, {
    foreignKey: 'pawId',
    through: 'PawLegs  // a through join table MUST be defined
  })
}

Dies wäre der richtige Weg, um das zu implementieren, was Sie ursprünglich mit

versucht haben
Leg.hasOne(paw)
paw.hasMany(leg)