PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Asosiasi dalam sekuel tidak berfungsi sebagaimana mestinya

Ada banyak masalah. Saya akan mencoba mengatasinya secara bertahap.

1) Model Secara default, jika Anda tidak mendeklarasikan primaryKey , kemudian sekuel secara otomatis menambahkan id kolom untuk Anda. Jadi legId bukan kolom yang berguna.

Selanjutnya, jika Anda mengaitkan model, foreignKey referensi ditambahkan untuk Anda, jadi pawId tidak boleh dideklarasikan.

Jadi Legs.js harus diubah menjadi:

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
}

Di atas memberi saya kolom berikut di pgAdmin :

2) Asosiasi

Asosiasi berikut tidak masuk akal, dan seharusnya menyebabkan kesalahan:

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

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

Setiap Leg harus memiliki satu Paw , dan dengan demikian saya menyarankan yang berikut:

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) Kunci Asing

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

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

4) Bersemangat Memuat

Saat ingin memuat asosiasi bersarang, Anda harus include mereka. Anda juga harus menggunakan as alias yang cocok dengan asosiasi model Anda:

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

Dengan menggunakan seluruh penyiapan ini dan kueri di atas, saya memperoleh:

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

Karena ini jelas merupakan pengaturan latihan, Anda dapat memodifikasi Paw menjadi belongsToMany hubungan (mungkin Anda memiliki kucing siam dengan cakarnya?) sebagai berikut:

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

Ini akan menjadi cara yang benar untuk menerapkan apa yang awalnya Anda coba dengan

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. 7 Tips Praktik Terbaik untuk Pemuatan Data Massal PostgreSQL

  2. Saya terus mendapatkan hubungan kesalahan [TABLE] tidak ada

  3. Terjadi kesalahan saat membaca data dari penyedia. Sertifikat jarak jauh tidak valid menurut prosedur validasi

  4. PGAdmin III tidak dapat menghubungkan AWS RDS

  5. Manajemen dan Otomatisasi PostgreSQL dengan ClusterControl