为了账号安全,请及时绑定邮箱和手机立即绑定

sequelize 关联查询问题

sequelize 关联查询问题

尚方宝剑之说 2019-05-08 12:51:55
目前遇到的问题是通过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';//加载modelthis.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.网上也找不到相应的问题,希望大神帮忙解决一下。非常感谢!
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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'
}]
})
                            
查看完整回答
反对 回复 2019-05-08
  • 2 回答
  • 0 关注
  • 1351 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信