Sequelize-关联查询上
在关联查询当中分别有一对一,一对多,多对多等关系,首先,先来看一对一的,创建一个 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 关系去除了查询也是同理,如上是直接报错了,这就是表示查询不了所对应的人。