sql >> Database teknologi >  >> RDS >> PostgreSQL

Foreninger i efterfølger fungerer ikke efter hensigten

Der er mange problemer. Jeg vil forsøge at behandle dem trinvist.

1) Modeller Som standard, hvis du ikke erklærer en primaryKey , derefter tilføjer sequelize automatisk et id kolonne til dig. Således legId er ikke en nyttig kolonne.

Desuden, hvis du tilknytter en model, foreignKey reference tilføjes til dig, således pawId bør ikke erklæres.

Således Legs.js skal ændres til:

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
}

Ovenstående giver mig følgende kolonner i pgAdmin :

2) Foreninger

Følgende tilknytning giver ikke mening, og bør forårsage en fejl:

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

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

Hvert Leg skal have én Paw , og derfor foreslår jeg følgende:

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) Fremmednøgler

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

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

4) Ivrig indlæsning

Når du ivrig indlæser indlejrede associationer, skal du include dem. Du bør også bruge as alias, der matcher dine modeltilknytninger:

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

Ved at bruge hele denne opsætning og ovenstående forespørgsel får jeg:

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

Fordi dette åbenbart er en øvelsesopsætning, kan du ændre Paw at være en belongsToMany forhold (måske har du sammenføjede katte ved poten?) som følger:

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

Dette ville være den korrekte måde at implementere det, du oprindeligt forsøgte med

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



  1. Hvordan kombinerer man to tabeller til egne de samme kolonner?

  2. Advarsel:join() [function.join]:Ugyldige argumenter sendt i C

  3. Brug OBJECT_NAME() til at hente et objekts navn fra dets object_id i SQL Server

  4. Her er tre grunde til, at du kan se topaktivitet i din SQL-instans