sequlize 查询时间范围和多表查询

2023-01-12 16:57:38 浏览数 (2)


「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」

查询时间范围

between

前端传参时间范围 如:createdAtFrom = '', createdAtTo = '' ,并且在后端接收参数后给的默认值 ''

代码语言:javascript复制
 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表中的一些字段
代码语言:javascript复制
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

代码语言:javascript复制
 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('表名.想要的字段名')
代码语言:javascript复制
   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
        });
 

0 人点赞