postgresql hasMany调用了不是Sequelize.Model示例的内容

qyswt5oh  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(9)|浏览(123)

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

我的用户型号

"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;
}
jchrr9hc

jchrr9hc1#

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

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

当你在模型之间有一个1:N的关系时,你只需要从“1”模型中引用id,在我们的例子中是User模型,在“N”模型中是Photos。这样做:

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

将在您的Foto表中创建一个名为“userId”的列,该列引用用户表。在这种方式下,两个模型可以按照您的意愿进行关联。

bjp0bcyl

bjp0bcyl2#

您可以在同一个文件中为两个模型定义关系。它不会抛出任何错误。
在你的Foto.js中,你可以尝试:

...

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

return Foto;
vtwuwzda

vtwuwzda3#

我也遇到过类似的问题。有时可能是因为在index.js或app.js中,文件是以特定的顺序加载的,例如,如果A和B之间存在关系,A首先加载并引用B,然后B引用A,则错误将在B文件中抛出,因为A尚未完全定义/执行。
解决这个问题的方法是从模型文件中删除所有关联,在你的应用或index.js中需要它们,然后定义它们的关系。
例如

const entities = {
  A: require('./src/Entity/A'),
  B: require('./src/Entity/B'),
};
entities.A.belongsToMany(entities.B, {through: 'AB'});
entities.B.belongsToMany(entities.A, {through: 'AB'});
plupiseo

plupiseo4#

所以我得到了这个错误,我花了一些时间来处理这个bug。我意识到我得到了错误,因为我错误地引用了模型。Sequelize是区分大小写的,所以如果你用UpperCase创建了模型,确保在整个引用过程中保持一致。
我还想指出,你可以试试这个

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

nafvub8i5#

似乎需要在包含1:many关联的1部分的文件中定义关系的两端。也就是说,在您的情况下的“用户”文件。
所以:
String s(String s); Foto. footsTo(User);

zsbz8rwp

zsbz8rwp6#

上述解决方案都不适用于我的场景(可能适用于其他设置)。我偶然发现了这篇文章,其中指出您必须在应用关联之前定义和导出模型。使用一个单独的extra-setup.js文件来定义关联,对我来说很有效。
https://github.com/sequelize/express-example/tree/master/express-main-example

yx2lnoni

yx2lnoni7#

我遇到了很多问题,但我切换到使用sequelize CLI,它以这种格式生成模型,然后我发现创建关联要容易得多,因为索引文件会处理所有事情,并且模型本身中的static associate({ PersonalDetail })已经需要您的模型在一个地方,您需要做的就是解构它们,所以不需要在文件顶部要求任何东西。
这个youtube视频真的帮了我大忙。https://www.youtube.com/watch?v=3qlnR9hK-lQ

'use strict'
const { Model } = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate({ PersonalDetail }) {
      // define association here
      this.hasMany(PersonalDetail, {
        foreignKey: 'userId',
        //as: 'personalDetails',
      })
    }
  }
  User.init(
    {
      uuid: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
      },
  
      moredata below: {
        type: DataTypes.STRING,
        allowNull: false,
      },

      //createdAt/updatedAt is defined in migration and updated automatically
    },
    {
      sequelize,
      tableName: 'users',
      modelName: 'User',
    }
  )
  return User
}
ocebsuys

ocebsuys8#

我也有同样的问题。所有Map都按照文档中的解释完美地完成了。然而,我收到了关于协会的问题。
多里安在这个论坛上给出了理由。
https://stackoverflow.com/a/60760296/16790144
我的方法:

models/company.js

const company = sequelize.define("company",{
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true,
  },
  companyName: {
    type: DataTypes.STRING,
    allowNull: false,
  }
});

export default company;

models/client.js

const Client = sequelize.define("client", {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true,
  },
  firstName: {
    type: DataTypes.STRING,
    allowNull: false,
  } 
});

export default Client;

models/clientCompany.js

const clientCompany = sequelize.define("client_company",{
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true,
  },
  companyId: {
    type: DataTypes.INTEGER
  },
  clientId: {
    type: DataTypes.INTEGER
  }
});

export default clientCompany;

models/index.js

import Company from './company';
import Client from './client';
import ClientCompany from './clientCompany';

Company.belongsToMany(Client, { through : ClientCompany });
Client.belongsToMany(Company, { through : ClientCompany });

export {
  Company,
  Client,
  ClientCompany,
};

handler.js此文件包含业务逻辑。

import { Client, Company } from '../../models';

const company = await Company.findOne({
  where: { id: companyId },
  include: Client,
});
dw1jzc5e

dw1jzc5e9#

我已经做了以下改变,它对我有效
1.将导出更改为
const User = sequelize.define(//这里是你的模型代码)
module.exports =用户

exports.User = sequelize.define(
//
)

然后在单独的文件中导入两个模型,并在该单独的文件中定义关系,我将该文件命名为userCollection.js,下面是代码

const { Collection } = require("../models/collection");
const { User } = require("../models/user");

User.hasMany(Collection, { foreignKey: "userId", as:"collections", });
Collection.belongsTo(User, { foreignKey: "userId" })

相关问题