问题描述
我正在制作一个类似于“ Twitter”的Web应用程序。
我运行服务器时,
'user与用户多次关联。为了确定正确的关联, 您必须使用'as'关键字来指定要包含的关联的别名。
我为“关注者”和“关注者”之间的关系应用了“ as”关键字。 但是错误消息不断出现。
我确定我在某种程度上做错了,但我无法弄清楚到底是什么。 有人可以帮我吗?
- models / index.js
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable],config);
} else {
sequelize = new Sequelize(config.database,config.username,config.password,config);
}
fs
.readdirsync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = require(path.join(__dirname,file))(sequelize,Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = require('./user')(sequelize,Sequelize);
db.Post = require('./post')(sequelize,Sequelize);
db.Hashtag = require('./hashtag')(sequelize,Sequelize);
db.User.hasMany(db.Post); //1 : n
db.Post.belongsTo(db.User);
// m: n
db.Post.belongsToMany(db.Hashtag,{ through: 'PostHashtag' });
db.Hashtag.belongsToMany(db.Post,{ through: 'PostHashtag' });
// I use alias here *****
db.User.belongsToMany(db.User,{
foreignKey: 'followingId',as: 'Followers',through: 'Follow',});
db.User.belongsToMany(db.User,{
foreignKey: 'followerId',as: 'Followings',});
module.exports = db;
- models / user.js
module.exports = (sequelize,DataTypes) => (
sequelize.define('user',{
email: {
type: DataTypes.STRING(40),allowNull: true,unique: true,},nick: {
type: DataTypes.STRING(15),allowNull: false,password: {
type: DataTypes.STRING(100),provider: {
type: DataTypes.STRING(10),defaultValue: 'local',snsId: {
type: DataTypes.STRING(30),{
timestamps: true,paranoid: true,})
);
- models / post.js
module.exports = (sequelize,})
);
- models / hashtag.js
module.exports = (sequelize,DataTypes) => (
sequelize.define('hashtag',{
title: {
type: DataTypes.STRING(15),{
timestamps: true,})
);
解决方法
我认为这将解决您的问题,您必须创建一个表follower
,然后将其与具有关注和关注者别名的用户表相关联,并使用它来查询关注者和关注者
关注者模型
module.exports = (sequelize,datatypes) => {
sequelize.define('follower',{
_id: {
type: datatypes.integer,allownull: false,primarykey: true,autoincrement: true
},userid: {
type: datatypes.integer,allownull: false
},followingid: {
type: datatypes.integer,allownull: false
}
});
}
关联
db.follower.belongsTo(db.user,{
as: 'following',foreignkey: 'followingid'
});
db.follower.belongsto(db.user,{
as: 'follower',foreignkey: 'userid'
});
查询以获取关注者
follower.findall({
where: {
followingid: userid
},attributes: ['_id'],include: [{
model: user,attributes:
['fullname','username','_id','picture'],as: 'follower'
}]
})