求大佬指点哈!sequelize 关联查询问题求解答!

目前遇到的问题是通过sequelize进行关联查询后需要的问题是关联查询结果第一次查询没问题,再查询一次就会报错。1、两个关联的模型(1)菜单模型
'usestrict';
module.exports=app=>{
const{STRING,INTEGER,DATE}=app.Sequelize;
lettable_name='qt_admin_menu';
constAdminMenu=app.model.define(table_name,{
menu_id:{
type:'VARCHAR(32)',
allowNull:false,
defaultValue:'',
primaryKey:true
},
parent_id:{
type:'VARCHAR(32)',
allowNull:false,
defaultValue:'0',
primaryKey:false
},
pk:{
type:'VARCHAR(32)',
allowNull:false,
defaultValue:'',
primaryKey:false
},
menu_type:{
type:'TINYINT(3)UNSIGNED',
allowNull:true,
defaultValue:'1',
primaryKey:false
},
top_menu:{
type:'INT(1)UNSIGNED',
allowNull:true,
defaultValue:'2',
primaryKey:false
},
status:{
type:'TINYINT(3)UNSIGNED',
allowNull:true,
defaultValue:'1',
primaryKey:false
},
list_order:{
type:'TINYINT(5)UNSIGNED',
allowNull:true,
defaultValue:'1',
primaryKey:false
},
menu_app:{
type:'VARCHAR(15)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
controller:{
type:'VARCHAR(30)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
action:{
type:'VARCHAR(30)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
url_method:{
type:'VARCHAR(10)',
allowNull:true,
defaultValue:'get',
primaryKey:false
},
menu_url:{
type:'VARCHAR(200)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
param:{
type:'VARCHAR(50)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
menu_name:{
type:'VARCHAR(30)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
icon:{
type:'VARCHAR(20)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
remark:{
type:'VARCHAR(255)',
allowNull:true,
defaultValue:'',
primaryKey:false
},
isdelete:{
type:'INT(1)',
allowNull:true,
defaultValue:'2',
primaryKey:false
}
});
//AdminMenu.removeAttribute('id');
returnAdminMenu;
};
(2)角色菜单关联表模型
'usestrict';
module.exports=app=>{
const{STRING,INTEGER,DATE}=app.Sequelize;
lettable_name='qt_admin_role_menu';
constAdminRoleMenu=app.model.define(table_name,{
id:{
type:'INT(11)',
allowNull:false,
defaultValue:null,
primaryKey:true,
autoIncrement:true
},
role_id:{
type:'INT(11)',
allowNull:false,
primaryKey:false
},
menu_id:{
type:'VARCHAR(32)',
allowNull:false,
defaultValue:'',
primaryKey:false
}
});
returnAdminRoleMenu;
};
2、service里面的查询
'usestrict';
constService=require('egg').Service;
classMenuServiceextendsService{
//默认不需要提供构造函数。
constructor(ctx){
//如果需要在构造函数做一些处理,一定要有这句话,才能保证后面`this.ctx`的使用。
super(ctx);
//就可以直接通过this.ctx获取ctx了
//还可以直接通过this.app获取app了
this.table_name='qt_admin_menu';
//加载model
this.adminMenuModel=ctx.model.AdminMenu;
this.adminRoleMenuModel=ctx.model.AdminRoleMenu;
//定义hasMany关联
this.adminMenuModel.hasMany(this.adminRoleMenuModel,{
as:'u',
through:null,
foreignKey:'menu_id'
})
//this.adminRoleMenuModel.belongsToMany(this.adminMenuModel,{
////as:'adminMenuModel',
//foreignKey:'menu_id'
//});
}
asyncgetRoleMenu(rid){
//[this.app.Sequelize.fn('if','adminRoleMenuModel.menu_idisnull','false','true'),'selected']
constresult=awaitthis.adminMenuModel.findAll({
raw:true,
attributes:['menu_id','parent_id','menu_name','icon',[this.app.Sequelize.col('u.id'),'selected']],
include:[{
attributes:[],
model:this.adminRoleMenuModel,
as:'u',
where:{
role_id:rid,
},
required:false
}],
order:[
['top_menu','ASC'],
['list_order','ASC']
]
})
//.then(rows=>rows&&rows.map(r=>r.toJSON()));
//console.log(result);
//constresult=awaitthis.app.mysql.query('selecta.*,b.menu_idasselectedex,if(b.menu_idisnull,"false","true")asselectedfromqt_admin_menualeftjoinqt_admin_role_menubona.menu_id=b.menu_idandb.role_id=?ORDERBYa.top_menu,a.list_order',[rid]);
returnresult;
}
}
module.exports=MenuService;
3、查询结果修改完文件之后,执行请求,查询结果正常,打印SQL也正常
SELECT`qt_admin_menu`.`menu_id`,`qt_admin_menu`.`parent_id`,`qt_admin_menu`.`menu_name`,`qt_admin_menu`.`icon`,`u`.`id`AS`selected`FROM`qt_admin_menu`AS`qt_admin_menu`LEFTOUTERJOIN`qt_admin_role_menu`AS`u`ON`qt_admin_menu`.`menu_id`=`u`.`menu_id`AND`u`.`role_id`='3'ORDERBY`qt_admin_menu`.`top_menu`ASC,`qt_admin_menu`.`list_order`ASC;
结果数据:
{menu_id:'ef535c8a938665d1d0641a4e86ee83ed',
parent_id:'a8e66f7be77c9bf71a2511331ac6ba32',
menu_name:'列表组',
icon:null,
selected:null}
但是再执行一次就会报错了Youhaveusedthealiasuintwoseparateassociations.Aliasedassociationsmusthaveuniquealiases.
网上也找不到相应的问题,希望大神帮忙解决一下。非常感谢!
一只斗牛犬
浏览 880回答 2
2回答

天涯尽头无女友

service里面的关联查询参考constCategories=Product.hasMany(Tag,{as:'categories'});Product.create({id:1,title:'Chair',categories:[{id:1,name:'Alpha'},{id:2,name:'Beta'}]},{include:[{model:Categories,as:'categories'}]})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript