Sequelize多表联合查询案例

Sequelize多表联合查询案例一、Table:现在有两个表,A和B,关联关系:MATCH表中的job_history_id与JOB_HISTORY表中的id相关联。二、需求:查询Match表中的user_id,report_comment,以及job_history_id所关联的JOB表中的job_link,在前端显示。三、Code:1.后端首先要建立两个表的关联:MatchScoreReportModel.belongsTo(JobHistoryModel,{foreignKey:’job_history

大家好,又见面了,我是你们的朋友全栈君。

一、Table:

现在有两个表,A和B,关联关系:
MATCH表中的job_history_id与JOB_HISTORY表中的id相关联。
在这里插入图片描述

二、需求:

查询Match表中的user_id,report_comment,以及job_history_id所关联的JOB表中的job_link,在前端显示。

三、Code:

1. 后端

首先要建立两个表的关联:

MatchScoreReportModel.belongsTo(JobHistoryModel, { 
   
  foreignKey: 'job_history_id',
  targetKey: 'id',
});

在这里插入图片描述
然后开始查询,中间用include进行连接:

const { 
    rows, count } = await MatchScoreReport.findAndCountAll({ 
   
  attributes: ['user_id', 'report_comment'],
  ...
  include: [
    { 
   
      attributes: ['job_link'],
      model: JobHistoryModel,
    },
  ],
  ...
});
return { 
   
  rows,
  count,
};

中间的…,指的是你的一些其他的条件。核心就是其中的include: []。
这样就能查询出来我们想要的三个字段:user_id,report_comment,job_link。

但是我们看一下拼接出来的SQL,以及查询出来的结果:

SELECT `MATCH_SCORE_REPORT`.`user_id`,
       `MATCH_SCORE_REPORT`.`report_comment`,
       `JOB_HISTORY`.`job_link` AS `JOB_HISTORY.job_link`
FROM `MATCH_SCORE_REPORT` AS `MATCH_SCORE_REPORT`
         LEFT OUTER JOIN `JOB_HISTORY` AS `JOB_HISTORY` ON `MATCH_SCORE_REPORT`.`job_history_id` = `JOB_HISTORY`.`id`;

我们可以看到,它是给job_link起了一个别名,叫做JOB_HISTORY.job_link。
返回的结果部分截图(数据脱敏处理):
在这里插入图片描述
这样的话,前端得到的也是一个带有JOB_HISTORY.前缀的结果,
所以前端进行结果的遍历和处理的时候,也需要额外多做一些处理:

2. 前端

首先是接口的定义,对应的属性使用''包裹起来。

interface ReportComments { 
   
  user_id: string;
  report_comment: string;
  'JOB_HISTORY.job_link': string;
}

其次是遍历的时候,根据不同的框架可能需要自己调整获取的方式,但是直接xxx.xxx.xxx是会报错的,不过大概就那么几种方式,试试就能试出来:

我的情况:
(注意其中的不同,original.report_comment和original['JOB_HISTORY.job_link'])

{ 
   
  Header: 'Comment',
  Cell({ 
    original }: { 
    original: ReportComments }) { 
   
    return <div className="p-2">{ 
   original.report_comment}</div>;
  },
},
{ 
   
  Header: 'JobURL',
  Cell({ 
    original }: { 
    original: ReportComments }) { 
   
    return <div className="p-2">{ 
   original['JOB_HISTORY.job_link']}</div>;
  },
},

另一位大佬的情况, 我贴上地址和截图:
https://blog.csdn.net/lvyuan1234/article/details/86727703
在这里插入图片描述
大同小异,简单一弄就好了。

四、后记:

有人可能会有疑问,我其实也有这个疑问,那个多余的前缀我们能不能去掉,我找了半天没找到办法,看到有个帖子说,目前还不支持,所以我就放弃了。如果实在需要,就可以自己写SQL。
不知道未来的版本是否会支持,或者是不是已经存在好的办法,我没搜到,如果有大佬知道,还望不吝赐教!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144746.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 断点调试原理

    断点调试原理调试断点原理   调试断点,依赖于父进程和子进程之间的通信,打断点实际是在被调试的程序中,改变断点附近程序的代码,这个断点使得被调试的程序,暂时停止,然后发送信号给父进程(调试器进程),然后父进程能够得到子进程的变量和状态。达到调试的目的。   修改断点附近程序的指令地址为0xcc,这个地址的指令就是int3,含义是,是当前用户态程序发生中断,告诉内核当前程序有断点,那么内核

    2022年5月22日
  • Maven 菜鸟教程 3 怎样启动web项目

    Maven 菜鸟教程 3 怎样启动web项目方案1:dos运行运行cmd输入mvnjetty:runjetty插件版本先在pom.xml添加jetty插件jdk7可以使用jetty插件7.1.0.RC1jdk8要使用高版本插件,如8.1.16.v20140903org.mortbay.jetty

    2022年9月7日
  • EL表达式详解_EL表达式问内置对象属性值

    EL表达式详解_EL表达式问内置对象属性值 EL表达式   1、EL简介1)语法结构    ${expression}2)[]与.运算符   EL提供.和[]两种运算符来存取数据。   当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用[]。例如:     ${user.My-Name}应当改为${user

    2022年7月28日
  • win7设置电脑锁屏时间怎么设置_win7自动锁屏设置无效

    win7设置电脑锁屏时间怎么设置_win7自动锁屏设置无效方法/步骤1小编用的win7电脑,进入控制面板先~2选择系统与安全选项。3如图所示,箭头所指,可以设置锁屏时间,不过电源选项中还有个设置开启屏幕输入密码的设置,第一个就是。4如图所示,可以设置自动锁屏

    2022年8月5日
  • i686和x86_64的区别

    i686和x86_64的区别i686的解释:i代表intel系列的cpu。386几乎适用于所有的x86平台,不论是旧的pentum或者是新的pentum-IV与K7系列的CPU等等,都可以正常的工作!那个i指的是Intel兼容的CPU的意思,至于386不用说,就是CPU的等级啦!i586就是586等级的计算机,那是哪些呢?包括pentum第一代MMXC…

    2022年6月7日
  • JAVA增强for循环

    JAVA增强for循环增强for循环为什么需要增强for循环呢?简化数组和集合的遍历。想要使用增强for循环必须先要了解它的格式增强for循环的格式for(数据类型变量名:数组或者集合对象){ //循环体,变量即元素}下边我们通过案例演示一下://需求通过增强for遍历list集合。publicstaticvoidmain(String[]args){ //复习一下如何创建List集合 //1.创建元素对象 Listlist=newArrayList(); }…

    2022年6月16日

发表回复

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

关注全栈程序员社区公众号