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 1つの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. PHPがmysql_*からmysqli_に移行します

    2. PDOを使用してWHERE句を使用してSELECTクエリから返される行数を効率的に取得する

    3. SQLクエリで列名が重複しています

    4. MySQLは、チェック時にインデックスを使用しません=1ですが、=0で使用します