PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Асоциациите в последователността не работят по предназначение

Има много въпроси. Ще се опитам да им обърна внимание постепенно.

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
}

Горното ми дава следните колони в pgAdmin :

2) Асоциации

Следната връзка няма смисъл и трябва предизвика грешка:

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

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

Всеки Leg трябва да има една 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django:изберете стойности с максимални времеви марки или се присъединете към същата таблица

  2. Обединяване на резултатите от таблицата в колони (завъртане/кръстосан анализ?)

  3. Проблем с Postgres ALTER TABLE

  4. Как да дефинирам псевдоним на оператор в PostgreSQL?

  5. Postgres проста "обърна" таблица