node.js中sequelize处理三张表的问题

发布于 2022-09-11 21:51:48 字数 731 浏览 18 评论 0

在Mysql中定义了三张表

Course表定义课程

id 主键

title 标题

subtitle 副标题

intro 介绍

等等字段

CourseVideo 表(目前课程与Video一对一关系)

id 主键

course_id 课程ID

video_url 视频地址

created_time

update_time

CourseSub 课程订阅表 (一个课程可能对应多条,一个用户订阅一个课是一条,一个用户也会订阅多个课)

id

course_id 对应的课程ID

user_id

status 订阅状态  on ,off

现在需要做一个课程列表,并且已知用户Id 及 user_id

怎么能够(尽量只通过sequlize查询mysql去处理逻辑)生成一个list数据,返回一个列表,列表每一条包含

包含 id title subtitle videourl status(当前用户订阅了就是on,没订阅就是off,其他用户的订阅无关)

想尽可能处理的优雅。请帮忙提供一下代码,查文档能想到 findAll 去查 course表 然后 association coursevideo表,之后再findAll一下 订阅表,使用where参数查出所有自己的数据。然后两个数组,在js层面去做结合。不知道有没有更好的办法,麻烦贴出代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉墨 2022-09-18 21:51:48

分析的问题,

  1. 你的查询主体 是 课程 Course,也就是通过 CourseModal 去查询,示例代码如下:

      CourseModal.findAll({
        attributes:['id','title','subtitle']
      });
  2. 课程视频的数据 CourseVideo,定义1对1的关系就好

      CourseModal.hasOne(CourseVideoModal,{
        as:'video',foreignKey:'course_id',sourceKey:'id'
      })
      
      // 修改查询语句
      
      CourseModal.findAll({
         attributes:['id','title','subtitle'],
         include:[
            {
              model:CourseVideoModal,
              as:'video',
              attributes:['video_url']
            }
         ]
      })
  3. 课程订阅的数据,CourseSub; 课程和他是 1对多的关系,需要定义1对多, 使用 hasMany
CourseModal.hasMany(CourseSubModal,{
  as:'courseSubList',
  foreignKey:'course_id',
  sourceKey:'id'
})

// 修改查询语句

    CourseModal.findAll({
       attributes:['id','title','subtitle'],
       include:[
          {
            model:CourseVideoModal,
            as:'video',
            attributes:['video_url']
          },
          {
            model:CourseSubModal,
            as:'courseSubList',
            attributes:['status','user_id']
          },
       ]
    })

// 最后出来的数据 list 应该是下面的类似的结构

list = [
   {
     id,
     title,
     subtitle,
     video:{
       video_url
     },
     courseSubList:[
       {
         status,
         user_id
       }
     ]
   }
]

// 最后用js 循环,处理下 courseSubList
list.map(course=>{
  let {courseSubList=[]} = course;
   courseSubList = courseSubList.map(courseSub=>{
    return {
      status:courseSub.user_id==userId?'on':'off'
    }
   })
   course.courseSubList = courseSubList;
   return course;
})

不知道上面的实现算不算 优雅,哈哈。

三五鸿雁 2022-09-18 21:51:48

在 Sequlize 中定义模型的时候,有没有定义关联?如果有,直接参考 Sequelize Association

如果没有定义,那就在查询的时候申明关联,比如(写了个大概,没调试)

async function query() {
    const courses = await Course
        .findAll({
            include: [
                {
                    association: Course.hasOne(CourseVideo, {
                        foreignKey: "course_id",
                        sourceKey: "id",
                        as: "video"
                    }),
                    attributes: ["video_url"]
                },
                {
                    assocation: Course.hasOne(CourseSub, {
                        foreignKey: "course_id",
                        sourceKey: "id",
                        as: "sub",
                    }),
                    attributes: ["status"],
                    where: { user_id: "123456" }
                }
            ],
            raw: true,
            nest: true
        });

    return courses.map(c => ({
        id: c.id,
        title: c.title,
        video_url: c.video.video_url,
        status: c.sub.status || "off"
    }));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文