5 postgresql node.js sequelize.js
因为你们可以看到我的问题与标题描述有关,我创建了一个用户模型和一个续集的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;
}
Run Code Online (Sandbox Code Playgroud)
我的照片模型
"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;
}
Run Code Online (Sandbox Code Playgroud)
Ell*_*key 18
您无需在照片模型上声明关联:
Foto.belongsTo(User, {foreignKey: 'userId'});
Run Code Online (Sandbox Code Playgroud)
当模型之间有1:N关系时,您只需要引用"1"模型中的id,在我们的情况下是"N"模型上的用户模型,照片.这样做:
User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'})
Run Code Online (Sandbox Code Playgroud)
将在Foto表上创建一个名为"userId"的列,该列引用用户表.通过这种方式,两个模型都可以根据需要关联.
Tou*_*fiq 10
您可以在一个文件中为两个模型定义关系。它不会以这种方式抛出任何错误。
在您的 Foto.js 中,您可以尝试:
...
Foto.belongsTo(User);
User.hasMany(Foto);
return Foto;
Run Code Online (Sandbox Code Playgroud)
小智 7
我有一个类似的问题。有时可能是因为在您的 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'});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14711 次 |
| 最近记录: |