• sequelize如何做到左外连接


    参考: https://www.cnblogs.com/wuweixin/p/9402125.html

    前提: 前端开发负责写前端页面以及node开发,node是基于egg.js,node的orm用的是sequelize

    例如一个游戏记录表需要一个关联一个HxGameGames的表

    /**
       * 游戏记录列表
       * @param {Object} body 传入参数
       * @param {Object} body.params ...params是除去limit,offset之后剩余的参数
       */
      async gameRecord({ limit, offset, ...params }) {
        const { rows, count } = await this.ctx.model.HxGameSummaryUserGame.findAndCountAll({
          attributes: { exclude: [ 'createdAt', 'updatedAt' ] },
          where: {
            ...params,
          },
          include: [
            {
              model: this.app.model.HxGameGames,
              as: 'game',
            },
          ],
          offset,
          limit,
        })
        return { list: rows, total: count }
      }
    

    那么这里include默认的就是内连接

    内连接:两个表都满足条件的情况下,返回公有数据
    左外连接: 左表所有数据,右表匹配不到的数据为null
    右外连接:保证右表所有数据,左表匹配不到的数据null填充

    假如前端需要实现一个页面,就是table,里面有很多的字段,在node端的处理就是user主表要关联baseInfo表,并且在做数据筛选的时候有对baseInfo表的userName进行筛选.不管baseInfo表的数据存在不存在,我需要体现完整的user主表的条数,并且筛选不出问题,那么我们需要做的就是将include变成左外连接,这里用required:false来实现
    官方文档: https://sequelize.org/master/manual/eager-loading.html#referring-to-other-columns

     /** 用户列表导出
       * @param { Object } body 查询条件数据对象
       * @param { String } body.userName 用户名
       * @param { Object } body.time 时间
       * @return { Object } list用户列表集合 total当前筛选条件下的记录总条数
       */
      async exportUserList({ 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',
            required: !!userName,
            where: {
              userName: {
                [Op.like]: `%${userName}%`,
              },
            },
          },
          ],
        })
        return { list: rows, total: count }
      }
    

    如果我直接去设置false的话, 那会变成左连接,意思就是假如user表有10数据,不管你怎么筛选,筛选出来的数据永远都是10条, required: !!userName 表示的就是 userName不存在时就是空,那么就是required: false, 左外连接出现全部的,如果存在的时候,直接内连接,直接筛选userName的数据为准

    如果大家有更好的建议,欢迎提出来

  • 相关阅读:
    动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
    梳排序(Comb sort)
    地精排序(Gnome Sort) 算法
    vs2010 调试 调用堆栈 窗口
    vs2010 条件断点 has changed是什么意思?
    vs2010根据字符串内容添加断点
    vs2010 调试中监视变量
    vs2010断点使用技巧
    区间重合判断(pojg校门外的树)
    转:Linus:利用二级指针删除单向链表
  • 原文地址:https://www.cnblogs.com/antyhouse/p/13254876.html
Copyright © 2020-2023  润新知