sql >> Database >  >> RDS >> PostgreSQL

Associaties in sequels werken niet zoals bedoeld

Er zijn veel problemen. Ik zal proberen ze stapsgewijs aan te pakken.

1) Modellen Standaard, als u geen primaryKey . declareert , en sequelize voegt automatisch een id toe kolom voor jou. Dus legId is geen nuttige kolom.

Bovendien, als u een model koppelt, wordt de foreignKey referentie is voor u toegevoegd, dus pawId mag niet worden aangegeven.

Dus Legs.js moet worden gewijzigd 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
}

Het bovenstaande geeft me de volgende kolommen in pgAdmin :

2) Verenigingen

De volgende associatie is niet logisch en moet een fout veroorzaken:

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

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

Elke Leg zou één Paw . moeten hebben , en daarom stel ik het volgende voor:

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) Buitenlandse sleutels

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

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

4) Bezig met laden

Bij het gretig laden van geneste associaties, moet je include hen. Gebruik ook as alias die overeenkomt met uw modelassociaties:

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

Met behulp van deze hele setup en de bovenstaande vraag, krijg ik:

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

Omdat dit duidelijk een oefenopstelling is, zou je Paw . kunnen aanpassen een belongsToMany zijn relatie (misschien heb je Siamese katten bij de poot?) als volgt:

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

Dit zou de juiste manier zijn om te implementeren wat u aanvankelijk probeerde met

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



  1. Hoe MySQL Trigger-uitzondering / storingsinfo op te slaan in een tabel of in variabelen

  2. Oracle SQL-transponering

  3. django.db.utils.IntegrityError:kolom venue_city bevat null-waarden

  4. mysql-jokerteken (negeer een/twee tekens bij het zoeken)