hasMany调用的东西不是Sequelize.Model的实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hasMany调用的东西不是Sequelize.Model的实例相关的知识,希望对你有一定的参考价值。

因为你们可以看到我的问题与标题描述有关,我创建了一个用户模型和一个续集的Foto模型,基本上用户可以拍摄许多照片,但每个照片只能与1个用户相关。

我的用户模型

    "use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');
var Foto = require('./Foto');

module.exports = function (sequelize, DataTypes) {
  var User = sequelize.define("User", {
    username: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isUnique: function (value, next) {
          var self = this;
          User.find({ where: { username: value } })
            .then(function (user) {
              // reject if a different user wants to use the same username
              if (user && self.id !== user.id) {
                return next('username already in use!');
              }
              return next();
            })
            .catch(function (err) {
              return next(err);
            });
        }
      }
    },

    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isUnique: function (value, next) {
          var self = this;
          User.find({ where: { email: value } })
            .then(function (user) {
              // reject if a different user wants to use the same email
              if (user && self.id !== user.id) {
                return next('Email already in use!');
              }
              return next();
            })
            .catch(function (err) {
              return next(err);
            });
        }
      }
    },

    typeOfUser: {
      type: DataTypes.INTEGER,
      allowNull:true,
      defaultValue:null
    },

    country: {
      type: DataTypes.STRING,
      allowNull:true,
      defaultValue:null
    },

    birthDate:{
      type: DataTypes.DATEONLY,
      allowNull:true,
      defaultValue:null
    },

    reports: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    },

    points: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    },

    password: {
      type: DataTypes.STRING,
      allowNull:false
    },

    numberFotos: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    }
  }, {
      classMethods: {
        generateHash: function (password) {
          return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },

      },
      instanceMethods: {
        validPassword: function (password) {
          return bcrypt.compareSync(password, this.password);
        }
      }


    });

  User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'})

  return Foto;
}

我的照片模特

"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');
var User = require('./User');


module.exports = function (sequelize, DataTypes) {
  var Foto = sequelize.define("Foto", {
    reports: {
      type: DataTypes.INTEGER,
      defaultValue: 0
    },
    image: {
      type: DataTypes.STRING,
      allowNull: false
    },
    date: {
      type: DataTypes.DATE,
      allowNull:true
    },
    position: {
      type: DataTypes.RANGE,
      allowNull: true
    }
  });

  Foto.belongsTo(User, {foreignKey: 'userId'});

  return Foto;
}
答案

您无需在照片模型上声明关联:

Foto.belongsTo(User, {foreignKey: 'userId'});

当模型之间有1:N关系时,您只需要引用“1”模型中的id,在我们的情况下是“N”模型上的用户模型,照片。这样做:

User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'})

将在Foto表上创建一个名为“userId”的列,该列引用用户表。通过这种方式,两个模型都可以根据需要关联。

另一答案

您可以在一个文件中定义两个模型的关系。它不会以任何方式抛出任何错误。

在Photo.is中,您可以尝试:

...

Foto.belongsTo(User);
User.hasMany(Foto);

return Foto;

以上是关于hasMany调用的东西不是Sequelize.Model的实例的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize hasMany工作正常,但反比关系不正常

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

Grails - 简单的 hasMany 问题 - 在 create.gsp 中使用 CheckBoxes 而不是 HTML Select

Ember Mirage 模型:对于多个 hasMany 和 belongsTo

在hasmany的续集中与计数

在laravel 5.1单元测试中嘲笑hasMany关系