Sequelize-关联查询上

作者: adm 分类: node 发布时间: 2023-02-20

在关联查询当中分别有一对一,一对多,多对多等关系,首先,先来看一对一的,创建一个 User 表,存储的就是用户信息,然后在创建一个 Book 表,存储的就是用户拥有的书,它们之间的关系是一对一的,一个用户只能有一本书:

// 1.导入Sequelize
const Sequelize = require('sequelize');

(async () => {
    // 2.配置连接信息
    const sequelize = new Sequelize('demo', 'root', 'yangbuyiya', {
        // MySQL服务器地址
        host: 'www.yangbuyi.top',
        // MySQL服务器端口号
        port: 3310,
        // 注意点: Sequelize不仅仅能操作MySQL还能够操作其它类型的数据库
        // 告诉Sequelize当前要操作的数据库类型
        dialect: 'mysql',
        // 连接池
        pool: {
            // 最多有多少个连接
            max: 5,
            // 最少有多少个连接
            min: 0,
            // 当前连接多久没有操作就断开
            idle: 10000,
            // 多久没有获取到连接就断开
            acquire: 30000,
        }
    });

    // 3.创建模型
    const User = sequelize.define('user', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {
        // 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,

        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false,
    });

    const Book = sequelize.define('book', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        price: {
            type: Sequelize.DOUBLE,
            defaultValue: 66
        },
        uId: {
            type: Sequelize.INTEGER,
            allowNull: false
        }
    }, {
        // 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,

        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false,
    });

    sequelize.sync();
})();

创建对应的表了之后然后在插入对应的用户书籍数据:


INSERT INTO `book` VALUES (1, '玩转Vue', 999, 1);
INSERT INTO `book` VALUES (2, '玩转React', 66, 4);
INSERT INTO `book` VALUES (3, '玩转Golang', 8888, 5);

建立查询关系
官方文档:https://sequelize.org/v5/class/lib/associations/has-one.jHasOne.html


// hasOne 谁拥有一个谁 / 一个人拥有一本书
User.hasOne(Book, {
    foreignKey: 'uId',
    sourceKey: 'id'
});
// belongsTo 谁属于一个谁 / 一本书属于一个人
Book.belongsTo(User, {
    foreignKey: 'uId',
    sourceKey: 'id'
});

关联查询
只要建立了表与表之间的关系, 那么在查询人的时候, 就可以把这个人拥有的那本书也查询出来了:

let user = await User.findOne({
   where: {
       id: 1
   },
    include: {
       model: Book
    }
});

console.log(user);
console.log(user.book.dataValues);

如上是查询 User,如果我们在查询 Book 时,只要建立了表与表之间的关系, 那么在查询书的时候, 就可以把这本书属于哪一个人也查询出来了:

let book = await Book.findOne({
    where: {
        id: 1
    },
    include: {
        model: User
    }
});

console.log(book);
console.log(book.user.dataValues);

注意点
只要建立了人和书的关系, 那么在查询人的时候, 就可以把拥有的那本书也查询出来(上方已经介绍)
只要建立了书和人的关系, 那么在查询书的时候, 就可以把书属于哪个人也查询出来(上方已经介绍)
如果没有建立相关的关系, 那么就不能查询出相关的内容,假如我现在将书属于某一个人的关系去除了,那么在查询书的时候所对应的属于那个人就不会被查询出来如下:

将 User 与 Book 关系去除了查询也是同理,如上是直接报错了,这就是表示查询不了所对应的人。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!