「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」
查询时间范围
between
前端传参时间范围 如:createdAtFrom = '', createdAtTo = ''
,并且在后端接收参数后给的默认值 ''
createdAtFrom && (where['createdAt'] = {
[Op.between]: [createdAtFrom,createdAtTo]
})
多表查询
首先有两个表
用户表
代码语言:javascript复制const { DataTypes } = require('sequelize')
const seq = require('../db/seq')
// 创建模型 可以给表加前缀因为其自动化推断表名称,也可以让他不推断
const User = seq.define('User', {
// id 自动创建
username: {
// 去问档查看
type: DataTypes.STRING,
// 约束是否为空
allowNull: false,
// 唯一
unique: true,
comment: '用户名 唯一'
},
password: {
type: DataTypes.CHAR(64),
allowNull: false,
comment: '密码'
},
is_admin: {
// boolean 就是 tinity(1)
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0,
comment: '是否为管理员 0不是管理员'
},
user_id:{
type: DataTypes.INTEGER,
allowNull: true,
defaultValue: 0,
comment: '用户编号'
},
user_img:{
type: DataTypes.STRING,
allowNull: true,
comment: '头像'
},
register_date:{
type: DataTypes.DATE,
allowNull: true,
comment: '注册日期'
},
login_date:{
type: DataTypes.DATE,
allowNull: true,
comment: '最近登录日期'
}
})
用户详情表
代码语言:javascript复制const UserDetail = seq.define('UserDetail', {
user_id:{
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0,
comment: '用户编号',
unique: true,
},
phone:{
type: DataTypes.STRING,
allowNull: true,
comment: '手机号'
},
job:{
type: DataTypes.STRING,
allowNull: true,
comment: '职业'
},
tag:{
type: DataTypes.STRING,
allowNull: true,
comment: '标签'
},
signature:{
type: DataTypes.STRING,
allowNull: true,
comment: '座右铭'
},
email:{
type: DataTypes.STRING,
allowNull: true,
comment: '邮箱'
}
})
方法一
这中返回的格式,是将另一个表的数据放到一个对象中的,如下
代码语言:javascript复制const User = require('../model/user.model')
const UserDeatil = require('../model/user_detail.model')
User.belongsTo(关联表名也就是UserDetail,{foreignKey:'User表的外键也就是与UserDetail关联的user_id',targetKey:'目标表的关联键也就是UserDetail的user_id'})
include:[{ model:UserDeatil, attributes:['email'] }]
attributes也就是我要查UserDetail表中的一些字段
class UserManageService {
// 查询所有用户
async usermanage({ username, is_admin, createdAtFrom,createdAtTo, updatedAtFrom,updatedAtTo, currentPage, pageSize }) {
User.belongsTo(UserDeatil,{foreignKey:'user_id',targetKey:'user_id'})
const where = {};
username && (where['username'] = {
[Op.like]: username
})
is_admin && (where['is_admin'] = {
[Op.eq]: is_admin
})
createdAtFrom && (where['createdAt'] = {
[Op.between]: [createdAtFrom,createdAtTo]
})
updatedAtFrom && (where['updatedAt'] = {
[Op.between]: [updatedAtFrom,updatedAtTo]
})
const { count, rows } = await User.findAndCountAll({
where,
offset: (currentPage - 1) * pageSize,
limit: Number(pageSize),
include:[{
model:UserDeatil,
attributes:['email']
}]
});
return rows ? { data:rows , total:count } : { error: 500 }
}
}
也可以给这个表起别名
代码语言:javascript复制 include:[{
model:UserDeatil,
attributes:['email'],
as:'detail'
}]
方法二
把上面的对象的数据格式 拍平了
只需要加上 raw: true
const { count, rows } = await User.findAndCountAll({
where,
offset: (currentPage - 1) * pageSize,
limit: Number(pageSize),
include: [{
model: UserDeatil,
attributes: ['email'],
}],
raw: true
});
方法三
User.belongsTo(UserDeatil,{foreignKey:'user_id',targetKey:'user_id'})
这个也需要。
- Sequelize.col('表名.想要的字段名')
const { count, rows } = await User.findAndCountAll({
where,
offset: (currentPage - 1) * pageSize,
limit: Number(pageSize),
attributes: [Sequelize.col('UserDetail.email'), Sequelize.col('UserDetail.phone'), Sequelize.col('UserDetail.job'), Sequelize.col('UserDetail.tag'),
Sequelize.col('User.username'), Sequelize.col('User.id'), Sequelize.col('User.user_id'), Sequelize.col('User.is_admin'), Sequelize.col('User.user_img'),
Sequelize.col('User.createdAt'), Sequelize.col('User.updatedAt')],
include: [{
model: UserDeatil,
as: 'UserDetail',
// 这里为空
attributes: [],
} ],
// 需要
raw: true
});