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.js~HasOne.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 关系去除了查询也是同理,如上是直接报错了,这就是表示查询不了所对应的人。