把你我之間連起來。
建立方式
假設我有兩個 table:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const User = sequelize.define('User', { firstName: { type: DataTypes.STRING, allowNull: false }, lastName: { type: DataTypes.STRING } })
const Comment = sequelize.define('Comment', { content: { type: DataTypes.STRING, allowNull: false } })
|
接著就可以用一些 method 來把它們關聯起來:
1 2 3 4
| User.hasMany(Comment);
Comment.belongsTo(User);
|
通常一個 has
就會對應到一個 belongsTo
所以可以有這幾種寫法:
- 一對一:
hasOne
對 belongsTo
- 一對多:
hasMany
對 belongsTo
(最常用)
- 多對多:
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' }, 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", "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: [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
留的了。