sql >> Databasteknik >  >> RDS >> PostgreSQL

Föreningar i uppföljaren fungerar inte som tänkt

Det finns många frågor. Jag ska försöka ta itu med dem stegvis.

1) Modeller Som standard, om du inte deklarerar en primaryKey , sedan lägger sequelize automatiskt till ett id kolumn för dig. Alltså legId är inte en användbar kolumn.

Dessutom, om du associerar en modell, foreignKey referens läggs till för dig, alltså pawId bör inte deklareras.

Alltså Legs.js bör ändras till:

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
}

Ovanstående ger mig följande kolumner i pgAdmin :

2) Föreningar

Följande koppling är inte vettig, och bör orsaka ett fel:

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

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

Varje Leg bör ha en Paw , och därför föreslår jag följande:

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) Främmande nycklar

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

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

4) Ivrig laddning

När du ivrig laddar kapslade associationer måste du include dem. Du bör också använda as alias som matchar dina modellassociationer:

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

Genom att använda hela den här installationen och ovanstående fråga får jag:

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

Eftersom detta uppenbarligen är en övningsinställning kan du ändra Paw att vara en belongsToMany förhållande (du kanske har sammanfogade katter vid tass?) enligt följande:

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

Detta skulle vara det korrekta sättet att implementera det du först försökte med

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



  1. Tabellkommentarlängd i MySQL

  2. Ignorera kommatecken mellan citattecken när du läser CSV Oracles lagrade procedur UTL_FILE

  3. Hur läser man NCLOB, CLOB datavärden från Oracle-databasen med klassiska ASP-sidor?

  4. Köåtkomst till databasen för att undvika flera cacheobjekt