PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

सीक्वेल में संघ इरादा के अनुसार काम नहीं कर रहे हैं

कई मुद्दे हैं। मैं उन्हें क्रमिक रूप से संबोधित करने का प्रयास करूंगा।

1) मॉडल डिफ़ॉल्ट रूप से, यदि आप primaryKey घोषित नहीं करते हैं , फिर सीक्वेलाइज़ स्वचालित रूप से एक 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. लेनदेन करते समय परमाणु रूप से सीरियल मान सेट करें

  2. AMD64 पर रूबी पोस्टग्रेएसक्यूएल

  3. पोस्टग्रेज कॉपी कमांड, बाइनरी फाइल

  4. हेरोकू पर रेल ऐप पोस्टग्रेएसक्यूएल डेटाबेस को नहीं लिख सकता, केवल पढ़ें

  5. पोस्टग्रेएसक्यूएल से सीएसवी के रूप में लाइन फीड युक्त डेटा निर्यात करना