PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Các hiệp hội trong phần tiếp theo không hoạt động như dự kiến

Có rất nhiều vấn đề. Tôi sẽ cố gắng giải quyết từng bước một.

1) Mô hình Theo mặc định, nếu bạn không khai báo primaryKey , sau đó phần tiếp theo tự động thêm một id cột dành cho bạn. Vì vậy, legId không phải là một cột hữu ích.

Hơn nữa, nếu bạn liên kết một mô hình, thì foreignKey tham chiếu được thêm cho bạn, do đó pawId không nên khai báo.

Vì vậy, Legs.js nên được sửa đổi thành:

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
}

Phần trên cung cấp cho tôi các cột sau trong pgAdmin :

2) Hiệp hội

Liên kết sau không có ý nghĩa và nên gây ra lỗi:

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

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

Mỗi Leg nên có một Paw và do đó tôi đề xuất những điều sau:

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) Phím ngoại

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

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

4) Đang tải háo hức

Khi háo hức tải các liên kết lồng nhau, bạn phải include họ. Bạn cũng nên sử dụng as bí danh phù hợp với liên kết mô hình của bạn:

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

Sử dụng toàn bộ thiết lập này và truy vấn ở trên, tôi nhận được:

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

Thêm

Bởi vì đây rõ ràng là một thiết lập thực hành, bạn có thể sửa đổi Paw trở thành một belongsToMany mối quan hệ (có lẽ bạn có những con mèo dính liền bởi bàn chân?) như sau:

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

Đây sẽ là cách chính xác để triển khai những gì bạn đã cố gắng ban đầu

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. Tương lai của Postgres-XL

  2. Xuất Cơ sở dữ liệu Postgres thành tệp CSV

  3. Hội nghị mùa xuân FLOSS Vương quốc Anh

  4. Tại sao bạn nên học PostgreSQL?

  5. Postgres SQL để truy vấn văn bản mảng [] trong phần tử cụ thể