Sequelize 資料讀取
¶Sequelize 資料讀取
使用者需求 -> 搜尋的功能
要盡可能的多熟悉
¶Module.find()
找一個有兩種方式,使用時要考慮資料表「尋找唯一值」的最小條件。
findOne(options: Object)
findById(id: String)
model.findById(id).then(function(object) { |
model.findOne({ |
¶Module.findOrCreate(options: Object)
找不到就建立一個,使用時要注意 allowNull:false
並給予適合的預設值
.findOrCreate()
= .findOne()
|| .create()
User.findOrCreate({ |
public get(key: String, options: Object): Object | any
=> user.get({plain: true})
key = (虛擬)欄位名稱
¶Module.findAll(options: Object)
找一堆,使用時要注意條件太少時,資料是否海量 (影響效能)
.findAll()
縮寫 .all()
1 | Project.findAll().then(function(projects) { |
¶where 物件的條件
options: { |
v3 寫法 - findAll - Search for multiple elements in the database
v4 寫法 - findAll - Search for multiple elements in the database
邏輯包含下面這些
- attribute
- id != 20
- AND (a = 5), OR (a = 5 || a = 6)
- id > 6, id >= 6
- id < 10, id <= 10
- BETWEEN 6 AND 10, NOT BETWEEN 11 AND 15
- IN [1, 2], NOT IN [1, 2]
- LIKE ‘%hat’, NOT LIKE ‘%hat’
- attribute (PG only)
- && [1, 2] (PG array overlap operator)
- @> [1, 2] (PG array contains operator)
- <@ [1, 2] (PG array contained by operator)
- ILIKE ‘%hat’ (case insensitive) (PG only)
- NOT ILIKE ‘%hat’ (PG only)
- ANY ARRAY[2, 3]::INTEGER (PG only)
- status
- status NOT FALSE
¶用關聯過濾
找尋 3 個有 Profile
的 User
1 | //在 define 後加上 |
¶分頁 limit, offset, 排序 order, 群組 group
四個參數都要放在 options 裡使用
limit
每頁數offset
略過多少筆 (limit * index)group
群組order
排序- ASC 小至大 (正序)
- DESC 大至小 (反序)
options: { |
¶Module.max({}), .min({}), .sum({}), .count({})
四個 SQL 運算 methods 參數都是 options: Object
假設,資料表資料如下
id | age |
---|---|
1 | 10 |
2 | 5 |
3 | 40 |
¶max
1 | Project.max('age', { |
¶min
1 | Project.min('age', { |
¶sum
1 | Project.sum('age', { |
¶count
1 | Project.count({ |
¶Module.findAndCountAll(options: Object)
一堆與總數 = 分頁
findAndCountAll
= findAll
+ count
options 加上這兩個 property
limit
(每頁數)offset
(略過多少筆 limit * index)
成功時會回傳
count
匹配條件的總數raw
一個 Array 裝著符合條件的物件
1 | var result = await Code.findAndCountAll({ |
¶Eager loading 資料的關聯一起查出來
關聯一起查 = Eager loading
Model.
(find()
or findAll()
) + include
假設資料庫 關聯長這樣
Tool n–1 User 1–n Task
1 | var User = sequelize.define('user', { name: Sequelize.STRING }) |
這樣查詢可以找出關聯內容
1 | Task.findAll({ |
使用別名,別名要指定在 include
裡,而且回傳的結構會使用別名當欄位名稱
1 | options: { |
包含所有關聯
1 | options: { |
包含所有關聯 + 包含有刪除記錄(已刪除)
1 | options: { |
¶多層關聯
1 | options: { |
¶attributes
指定回傳欄位
在 options 陣列,給欄位字串,可指定回傳資料欄位
1 | options: { |
¶欄位使用別名
Query 的結果欄位,想要用 SQL 運算 (一定要再取個別名)
SELECT ..., COUNT(strField2) AS renameField, ... |
SELECT ..., strField2 AS renameField, ... |
-
用巢狀 Array 結構取別名
- attribute Array 的元素,也要用 Array
-
使用 aggregation function 呼叫 SQL 運算
- aggregation function:
sequelize.fn('COUNT', sequelize.col('strField2'))
- aggregation function:
-
不使用 SQL 運算,直接用
strField2
字串,也可以取別名
strField = sequelize.fn('COUNT', sequelize.col('strField2')) |
strField = strField2 |
使用要用 instance.get(renameField).
instance.renameField
item[renameField]
1 | Model.findAll({ |
原本的欄位 + 隔外欄位
1 | const field = [addField, renameField] |
原本的欄位 - 原本欄位
1 | const field = originalField |
¶Ordering 排序
1 | order: [ |
1 | operations: { |