首页 > 解决方案 > Why are my Associations not being recognized and causing a SequelizeEagerLoadingError?

问题描述

I'm trying to design my models in a way to have association from the party table to both the Attendee and Item tables. This way I could query both tables using the Party_Id.

Clearly I'm not going upon this the right way...Any thoughts on where I'm going wrong with this?

Thanks in advance!

Party Model

module.exports = function(sequelize, DataTypes) {
var Party = sequelize.define("Party", {
eventName: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
AuthenticationId: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
eventAddress: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
eventDate: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
eventTime: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
eventDescription: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
displayName: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
}
});

Party.associate = function(models) {
Party.hasMany(models.Attendee, {
  foreignKey: {
    allowNull: false
  },
  onDelete: "cascade"
});
};

return Party;
};

Attendee Model:

module.exports = function(sequelize, DataTypes) {
var Attendee = sequelize.define("Attendee", {
AuthenticationId: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
},
displayName: {
  type: DataTypes.STRING,
  allowNull: false,
  validate: {
    len: [1]
  }
 }
});

Attendee.associate = function(models) {
 Attendee.hasMany(models.Item, {
  foreignKey: {
    allowNull: false
  },
  onDelete: "cascade"
 });
};

Attendee.associate = function(models) {
 Attendee.belongsTo(models.Party, {
  foreignKey: {
    allowNull: false
  },
  onDelete: "cascade"
 });
 };

return Attendee;
};

Item Model

    module.exports = function(sequelize, DataTypes) {
      var Item = sequelize.define("Item", {
        itemName: {
          type: DataTypes.STRING,
          allowNull: false,
          validate: {
            len: [1]
          }
        },
        qtyRequested: {
          type: DataTypes.INTEGER,
          allowNull: false,
          validate: {
            len: [1]
          }
        },
        qtyCommited: {
          type: DataTypes.INTEGER,
          allowNull: true,
          validate: {
            len: [1]
          }
        },
        hostAdded: {
          type: DataTypes.BOOLEAN,
          allowNull: true,
          validate: {
            len: [1]
          }
        },
        AuthenticationId: {
          type: DataTypes.STRING,
          allowNull: false,
          validate: {
            len: [1]
          }
        },
        displayName: {
          type: DataTypes.STRING,
          allowNull: false,
          validate: {
            len: [1]
          }
        }
      });

      Item.associate = function(models) {
        Item.belongsTo(models.Attendee, {
          foreignKey: {
            allowNull: false
          },
          onDelete: "cascade"
        });
      };

      return Item;
    };

This is the query which is returning the error:

app.get("/parties/:id", (req, res) => {
 db.Party.findOne({
  where: { id: req.params.id },
    include: [
    {
      model: db.Attendee,
       include: [
        {
          model: db.Item
        }
      ]
    }
  ]
})
  .then(party => {
    console.log(party)
  })
  .catch(function(error) {
    console.log(error);
  });
});

Error:

   SequelizeEagerLoadingError: Item is not associated to Attendee!

标签: javascriptmysqlnode.jssequelize.js

解决方案


真正的问题是:

Attendee.associate = function(models) {
    Attendee.hasMany(models.Item, {
        foreignKey: {
            allowNull: false
        },
        onDelete: "cascade"
    });
};

Attendee.associate = function(models) { // <---- This will override the upper one
    Attendee.belongsTo(models.Party, {
        foreignKey: {
            allowNull: false
        },
        onDelete: "cascade"
    });
};

解决方案 :

Attendee.associate = = function(models) { 

    Attendee.hasMany(models.Item, {
        foreignKey: {
            allowNull: false
        },
        onDelete: "cascade"
    });

    Attendee.belongsTo(models.Party, {
        foreignKey: {
            allowNull: false
        },
        onDelete: "cascade"
    });
};

推荐阅读