有两个表,第一个接口:如果a表是主表,需要连接多个表,其中有个是b表,另一个接口,b表是主表,需要连接多个,其中有个是a表,那么这时候在model里面不需要做2次关联,直接1次关联,然后直接在service里面的include去用这个关联名字就可以了,例如:
在HxUserBaseInfo表里面
this.belongsTo(app.model.HxUser, { foreignKey: ‘userId‘, targetKey: ‘userId‘, as: ‘basic‘ })
在HxUser表里面
this.hasOne(app.model.HxUserBaseInfo, { foreignKey: ‘userId‘, sourceKey: ‘userId‘, as: ‘basic‘ })
HxUserBaseInfo为主表的时候
async baseInfoById(userId) {
const { rows } = await this.ctx.model.xxxxxxx.findAndCountAll({
attributes: { exclude: [ ‘createdAt‘, ‘updatedAt‘ ] },
where: {
userId,
},
include: [
{
model: this.app.model.HxUser,
as: ‘basic‘,
},
],
})
return { list: rows }
}
}
HxUser为主表的时候
async userList({ limit, offset, userName = ‘‘, time, ...params }) {
const { Op } = this.app.Sequelize
const { rows, count } = await this.ctx.model.HxUser.findAndCountAll({
attributes: { exclude: [ ‘createdAt‘, ‘updatedAt‘ ] },
distinct: true,
where: {
...time,
...params,
},
// 如果没有设置required: false的话 是inner 连接,如果设置了就是左连接
include: [{
model: this.app.model.HxUserBaseInfo,
as: ‘basic‘,
attributes: [ ‘userAvator‘, ‘userName‘, ‘gender‘ ],
required: !!userName,
where: {
userName: {
[Op.like]: `%${userName}%`,
},
},
},
],
offset,
limit,
})
return { list: rows, total: count }
}