zoukankan      html  css  js  c++  java
  • 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的数据为准

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

  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/antyhouse/p/13254876.html
Copyright © 2011-2022 走看看