Sequelize 建立關聯

把你我之間連起來。

建立方式

假設我有兩個 table:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 定義一個 User 的 table
const User = sequelize.define('User', {
// 設定欄位資訊
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
}
})
// 定義一個 Comment 的 table
const Comment = sequelize.define('Comment', {
// 設定欄位資訊
content: {
type: DataTypes.STRING,
allowNull: false
}
})

接著就可以用一些 method 來把它們關聯起來:

1
2
3
4
// 一個 user 對應到多個 comment(一對多)
User.hasMany(Comment);
// 一個 comment 屬於一個 user(一對一)
Comment.belongsTo(User);

通常一個 has 就會對應到一個 belongsTo 所以可以有這幾種寫法:

  • 一對一:hasOnebelongsTo
  • 一對多:hasManybelongsTo(最常用)
  • 多對多:belongsToMany

總之,只要你建立了關聯,Sequelize 就會自動幫你在關聯的 table 加上「外鍵(Foreign key)」,預設值是Model名稱 + Id

如果你想自定義的話可以在設定時傳入 Option

1
2
3
User.hasMany(Comment, {
foreignKey: 'yoyoyoUserId'
});

合併資料

接著就是最重要的合併,直接來看怎麼用。假設我想撈出 username=peanu 的所有留言:

1
2
3
4
5
6
7
8
9
10
~async function () {
const result = await User.findOne({
where: {
firstName: 'peanu'
},
// 把要合併的 Model include 進來
include: [Comment]
})
console.log(JSON.stringify(result, null, 4));
}()

輸出結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"id": 2,
"firstName": "peanu",
"lastName": "qq",
"createdAt": "2022-03-24T13:43:16.000Z",
"updatedAt": "2022-03-24T14:10:43.000Z",
// peanu 的所有留言
"Comments": [
{
"id": 2,
"content": "yoyoyo",
"createdAt": "2022-03-24T15:06:52.000Z",
"updatedAt": "2022-03-24T15:06:52.000Z",
"UserId": 2
},
{
"id": 3,
"content": "hello",
"createdAt": "2022-03-24T15:07:03.000Z",
"updatedAt": "2022-03-24T15:07:03.000Z",
"UserId": 2
}
]
}

Sequelize 就會自動新增一個 Comments 的欄位,代表這個人的所有留言。

當然也可以反過來,假設我想撈出某個 Comment 的 User 資料:

1
2
3
4
5
6
7
8
9
10
~async function () {
const result = await Comment.findOne({
where: {
id: 6
},
// 一樣用 include,只是身分互換
include: [User]
})
console.log(JSON.stringify(result, null, 4));
}()

輸出結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"id": 6,
"content": "bobo",
"createdAt": "2022-03-24T15:07:36.000Z",
"updatedAt": "2022-03-24T15:07:36.000Z",
"UserId": 1,
"User": {
"id": 1,
"firstName": "John",
"lastName": "hahaha",
"createdAt": "2022-03-24T13:29:05.000Z",
"updatedAt": "2022-03-24T14:19:39.000Z"
}
}

這樣我們就可以知道 id=6 的留言是 John 留的了。

Sequelize-CLI 基本使用 Sequelize 的 CRUD
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×