正如你们所看到的,我的问题与标题描述有关,我创建了一个用户模型,一个续集中的照片模型,基本上一个用户可以拍摄许多照片,但每个照片只能与一个用户相关。
我的用户型号
"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;
}
9条答案
按热度按时间jchrr9hc1#
您不需要在照片模型上声明关联:
当你在模型之间有一个1:N的关系时,你只需要从“1”模型中引用id,在我们的例子中是User模型,在“N”模型中是Photos。这样做:
将在您的Foto表中创建一个名为“userId”的列,该列引用用户表。在这种方式下,两个模型可以按照您的意愿进行关联。
bjp0bcyl2#
您可以在同一个文件中为两个模型定义关系。它不会抛出任何错误。
在你的Foto.js中,你可以尝试:
vtwuwzda3#
我也遇到过类似的问题。有时可能是因为在index.js或app.js中,文件是以特定的顺序加载的,例如,如果A和B之间存在关系,A首先加载并引用B,然后B引用A,则错误将在B文件中抛出,因为A尚未完全定义/执行。
解决这个问题的方法是从模型文件中删除所有关联,在你的应用或index.js中需要它们,然后定义它们的关系。
例如
plupiseo4#
所以我得到了这个错误,我花了一些时间来处理这个bug。我意识到我得到了错误,因为我错误地引用了模型。Sequelize是区分大小写的,所以如果你用UpperCase创建了模型,确保在整个引用过程中保持一致。
我还想指出,你可以试试这个
nafvub8i5#
似乎需要在包含1:many关联的1部分的文件中定义关系的两端。也就是说,在您的情况下的“用户”文件。
所以:
String s(String s); Foto. footsTo(User);
zsbz8rwp6#
上述解决方案都不适用于我的场景(可能适用于其他设置)。我偶然发现了这篇文章,其中指出您必须在应用关联之前定义和导出模型。使用一个单独的
extra-setup.js
文件来定义关联,对我来说很有效。https://github.com/sequelize/express-example/tree/master/express-main-example
yx2lnoni7#
我遇到了很多问题,但我切换到使用sequelize CLI,它以这种格式生成模型,然后我发现创建关联要容易得多,因为索引文件会处理所有事情,并且模型本身中的
static associate({ PersonalDetail })
已经需要您的模型在一个地方,您需要做的就是解构它们,所以不需要在文件顶部要求任何东西。这个youtube视频真的帮了我大忙。https://www.youtube.com/watch?v=3qlnR9hK-lQ
ocebsuys8#
我也有同样的问题。所有Map都按照文档中的解释完美地完成了。然而,我收到了关于协会的问题。
多里安在这个论坛上给出了理由。
https://stackoverflow.com/a/60760296/16790144
我的方法:
models/company.js
models/client.js
models/clientCompany.js
models/index.js
handler.js此文件包含业务逻辑。
dw1jzc5e9#
我已经做了以下改变,它对我有效
1.将导出更改为
const User = sequelize.define(//这里是你的模型代码)
module.exports =用户
到
然后在单独的文件中导入两个模型,并在该单独的文件中定义关系,我将该文件命名为userCollection.js,下面是代码