开发者社区> 答案命运> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Egg中使用Sequelize ORM框架操作MySQL--关联查询

简介: Egg中使用Sequelize ORM框架操作MySQL--关联查询
+关注继续查看

这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

一、Sequelize自定义表名

只需在定义model的时候,加入tableName字段即可。

module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;
  const User = app.model.define('user', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    username: STRING(30),
    age: INTEGER,
    sex: STRING(30),
    created_at: DATE,
    updated_at: DATE,
  },{
    tableName: "usera"
  });
  return User;
};
复制代码
  • 设置不显示createdAt等时间戳字段
{
    tableName: "usera",
    timestamps: false
}
复制代码

使用Sequelize实现多表查询

注意:如果数据库中使用的是下划线命名法,在model中需要使用驼峰命名法。

一对一查询

  • article表的结构

image.png

  • article的model
'use strict';
module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;
  const Article = app.model.define('article', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    title: STRING(255),
    description: STRING(255),
    cateId: INTEGER,
    state: INTEGER
  },{
    tableName: "article",
    timestamps: false
  });
  // 实现关联的核心代码是下面的语句
  Article.associate = function() {
    // 1对1
    app.model.Article.belongsTo(app.model.ArticleCate,{foreignKey: 'cateId'});
  }
  return Article;
};
复制代码
  • article_cate的model
'use strict';
module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;
  const ArticleCate = app.model.define('article_cate', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    title: STRING(255),
    state: INTEGER
  },{
    tableName: "article_cate",
    timestamps: false
  });
  return ArticleCate;
};
复制代码
  • 一对一查询方法
async onevsone() {
    const result = await this.ctx.model.Article.findAll({
      include: {
        model: this.ctx.model.ArticleCate
      }
    });
    this.ctx.body = result;
  }
复制代码

查询到的结果如下图所示:

image.png

一对多查询

  • article_cate.js
ArticleCate.associate = function () {
    // 1对1
    app.model.ArticleCate.hasMany(app.model.Article, { foreignKey: 'cateId' });
    
  }
复制代码
  • 路由
async onevsmany() {
    const result = await this.ctx.model.ArticleCate.findAll({
      include: {
        model: this.ctx.model.Article
      }
    });
    this.ctx.body = result;
  }
复制代码

多对多查询

多对多查询主要是使用belongsToMany。

  • 一门课程可以被多个学生选修
Lesson.associate = function(){
//一个课程可以被多个学生选修
    app.model.Lesson.belongsToMany(app.model.Student, {
    through: app.model.LessonStudent,
    foreignKey: 'lessonId',
    otherKey: 'studentId'
    });
}
复制代码
  • 一个学生可以选修多门课程(代码中的through指的是中间表)
Student.associate = function (){
    //一个学生可以选修多门课程
    app.model.Student.belongsToMany(app.model.Lesson, {
    through: app.model.LessonStudent,
    foreignKey: 'studentId', //注意写法
    otherKey: 'lessonId'
    });
}
复制代码
  • 查询语句
const { ctx } = this;
let result = await ctx.model.Student.findAll({
    include: {
    model: ctx.model.Lesson
    }
});


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL事务的四种隔离类型以及PHP框架Yii2中的源码解读和实际应用
MySQL事务的四种隔离类型以及PHP框架Yii2中的源码解读和实际应用
0 0
【Python | Flask框架】基于Flask框架的MySQL数据库交互系统(简单)
【Python | Flask框架】基于Flask框架的MySQL数据库交互系统(简单)
0 0
重学Node.js及其框架(Express, Koa, egg.js) 之 MySQL及Nodejs中使用MySQL(下)
重学Node.js及其框架(Express, Koa, egg.js) 之 MySQL及Nodejs中使用MySQL
0 0
重学Node.js及其框架(Express, Koa, egg.js) 之 MySQL及Nodejs中使用MySQL(上)
重学Node.js及其框架(Express, Koa, egg.js) 之 MySQL及Nodejs中使用MySQL
0 0
Servlet框架(servlet+jsp)+Mysql实现的增删改查+分页(功能包学生信息录入、学生信息增删改查、分页等)
Servlet框架(servlet+jsp)+Mysql实现的增删改查+分页(功能包学生信息录入、学生信息增删改查、分页等)
0 0
Python mini-web框架4:添加路由和MySQL功能
Python mini-web框架4:添加路由和MySQL功能
0 0
【MyBatis框架点滴】——mybatis插入数据返回主键(mysql、oracle)
  向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键。主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A、B中插入数据(A的主键是B的外键),向A表中插入数据之后,向B表中插入数据时需要用到A的主键。
0 0
Egg中使用Sequelize ORM框架操作MySQL--增删改查
Egg中使用Sequelize ORM框架操作MySQL--增删改查
0 0
cxa
Mysql存储之ORM框架SQLAlchemy
什么是ORM ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上 也就是说不用再操作mysql的底层语句,而是通过操作映射后的对象。 安装与导入Sqlalchemy包 安装需要 pip install sqlalchemy 另外这里用了pymysql作...
1585 0
Linux安装Mysql(图文解说详细版,安装包tar包版)
Linux安装Mysql(图文解说详细版,安装包tar包版)
0 0
+关注
答案命运
人有多自律,就有多自由!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
让 MySQL 原生分布式触手可及
立即下载
好的 MySQL 兼容可以做到什么程度
立即下载
云数据库RDS MySQL从入门到高阶
立即下载