Sequelize 踩坑筆記

  1. 1. 內建參數的位置
  2. 2. 基本用法
    1. 2.1. 使用其他 table
  3. 3. 建立關聯(associate)
    1. 3.1. include
    2. 3.2. group
  1. 範例以這裡為準(以下會換成 ES6 寫法),Koa 用法亦同
  2. 異步程式碼寫法以 co 這套件來簡化 Promise 寫法

內建參數的位置


基本用法

我們在 getFullName 裡加上以下這段

1
2
3
4
return co(function*() {
const user = yield User.findOne();
return `${user.firstName} ${user.lastName}`;
});

getterMethods 裡可以加入一個 fullName 的 function

1
2
3
4
5
getterMethods: {
fullName() {
return `${this.firstName} ${this.lastName}`;
}
}

這樣 getFullName 裡就可以直接寫 user.fullName 獲取全名了。

在外部使用時可以直接寫

1
2
3
4
5
6
const Models = require('/path/to/models');  // 注意範例裡的 index.js 內容

co(function*() {
const fullName = yield Models.User.getFullName();
console.log(fullName);
}).catch(console.error);

使用其他 table

假如我在 User 裡需要用到其他 table(假設叫 Family),我就可以寫 sequelize.models.Family 來呼叫。

建立關聯(associate)

假設有個 table 叫 Pet,裡面有個 key 叫 owner,用以紀錄 User 的 id。

兩邊的關聯性程式如下

1
2
3
4
5
6
7
// 寫在各自的 associate function 裡

// Pet
Pet.belongsTo(models.User, { foreignKey: 'owner' });

// User(owner 即為 Pet 裡的 key)
User.hasMany(models.Pet, { foreignKey: 'owner' });

include

在查找的 json 中用 include 時,hasManyhasOne 出來的 table 名稱會有單複數差異

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// hasMany
{
firstName: 'XXXX',
Pets: [{
...
}]
}

// hasOne
{
firstName: 'XXXX',
Pet: {
...
}
}

group

要將 include 的資料進行 group 或 order 時,需要連帶寫上 table 名稱,例:Pets.id