在關聯查詢當中分別有一對一,一對多,多對多等關系,首先,先來看一對一的,創建一個 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 關系去除了查詢也是同理,如上是直接報錯了,這就是表示查詢不了所對應的人。