前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sequlize 查询时间范围和多表查询

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

作者头像
用户4793865
发布2023-01-12 16:57:38
2.4K0
发布2023-01-12 16:57:38
举报
文章被收录于专栏:前端小菜鸡yym前端小菜鸡yym

「这是我参与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: '邮箱'
    }

})

方法一

这中返回的格式,是将另一个表的数据放到一个对象中的,如下

image.png
image.png
代码语言: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'
            }]

方法二

把上面的对象的数据格式 拍平了

image.png
image.png

只需要加上 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
        });
 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查询时间范围
    • between
    • 多表查询
      • 方法一
        • 方法二
          • 方法三
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档