orm

Nodejs+ Sequelize单表高级查询

特别声明:如果您喜欢小站的内容,可以点击 终身VIP¥188.00元 包年VIP¥88.00元 包季VIP¥28.00 包月VIP¥10.00元 进行全站阅读。 如果您对付费阅读有任何建议或想法,欢迎发送邮件至: 864479410@qq.com,或添加QQ:864479410(^_^)

引言

在第4小节上面,已经用了的 findAndCountAll() 分页查询方法,本小结重点围绕排序分组等细节部分讲讲

排序

普通排序

在我们直接代码的基础上,增加排序,比如根据年龄排序

let {rows, count} = await userDB.findAndCountAll({
  offset: offset,
  limit: pageSize,
  where: where,
  order: [['age', 'desc'], ['sex', 'asc']]
})

加入order参数,增加age倒序查询

高阶排序

需求,根据匹配程度排序返回,比如搜索name,或者描述中含有指定keyword的,按匹配度返回

(1)user表增加字段description

记得去db/model/user.js里面增加字段

(2)增加search接口

/**
 * 
 * @api {get} /api/user/search 用户搜索
 * @apiName 用户搜索
 * @apiGroup 用户
 * @apiDescription 返回搜索用户数据
 * @apiVersion  1.0.0
 * 
 * @apiParam {String} keyword='' 
 * 
 * @apiParamExample  {type} Request-Example:
 * {
 *     keyword: 1
 * }
 * 
 * @apiSuccess {Number} code 200
 * @apiSuccess {Array} resultList 数据集合
 * @apiSuccess {Object} paging 分页信息
 * @apiSuccessExample {type} Response-Example:
 * {
 *  code: 200,
 *  resultList: [],
 *  paging: {
 *    pageNo: 1,
 *    pageSize: 10,
 *    totalCount: 12,
 *    totalPage: 2
 *  }
 * }
 * 
 */
 router.get('/search', async (req, res) => {
  const params = req.body;

  let {pageNo=1, pageSize=10} = params
  pageSize = pageSize > 100 ? 100 : pageSize
  let offset = (pageNo - 1) * pageSize

  pageNo = +pageNo
  pageSize = +pageSize

  let keyword = params.keyword

  let {rows, count} = await userDB.findAndCountAll({
    raw: true,
    offset: offset,
    limit: pageSize,
    order: [ Sequelize.literal(`CASE
      WHEN name = "${keyword}" THEN 1 
      WHEN name like "${keyword}%" THEN 2
      WHEN name like "%${keyword}" THEN 3
      WHEN name like "%${keyword}%" THEN 4
      WHEN description like "${keyword}%" THEN 5
      WHEN description like "%${keyword}" THEN 6
      WHEN description like "%${keyword}%" THEN 7
      END
    `)],
    where: {
      [Op.or]: {
        name: {
          [Op.like]: `%${keyword}%`
        },
        description: {
          [Op.like]: `%${keyword}%`
        }
      }
    }
  })

  res.send({
    code: 200,
    resultList: rows,
    paging: {
      pageNo: pageNo,
      pageSize: pageSize,
      totalCount: count,
      totalPage: Math.ceil(count / pageSize)
    }
  })
})

先执行看看结果:

更多精彩内容,可以点击“立即支付”,查看隐藏内容哦!

内容查看价格3立即支付    升级VIP后免费升级VIP,支付前请先登录,支付前请先登录,支付前请先登录!
本站资源一次收费,永久下载!发现资源失效,联系站长恢复即可!由于源码具有可复制性、可传播性,一经购买,概不退货,购买前请再三确认!本站提供相关技术支持,网站底部联系即可。时间:周一 ~ 周五 9:30-18:00。谢谢合作!

VIP用户所有收费资源免费,登录后左上角点击 昵称 ,进入用户中心充值成为VIP会员!如果您已经登录,点击这里成为尊贵VIP用户!

(0)

本文由 Web秀 作者:Javan 发表,转载请注明来源!

热评文章

发表评论

邮箱地址不会被公开。 必填项已用*标注