Hi,大家好,昨天我們完成了Sequelize 的套件安裝、資料庫連線的設定與資料表的設定,今天我們來預定要完成資料處理的模組,會依照查詢、新增、修改、刪除進行說明,相信今天內容,看過之後應該會明白為什麼當我使用了 Sequelize 之後,就很少寫 SQL 了XDDD,那麼就讓我們開始吧。
和某藥品一樣,Sequelize分成2種,分別是回傳單筆資料的findOne和回傳多筆資料的findAll,2者的用法都相同,最大的差異是回傳值的不同,findOne回傳的是封裝好的物件,findAll回傳的是物件陣列,其參數如下
cases.findOne({ //資料表名稱為 cases
attributes: ['caseid', 'casedesc', 'fromper', 'logdate'], //回傳欄位陣列
where: { // 查詢條件
caseid: "1"
},
}).then((data) => {
//查詢完成處理,通常我是先判斷取出之 data是不是 null,若不是 null ,將 dataValues後取出後回傳
let result = {}
if(data) {
result = data.dataValues
}
}).catch((err) => {
//錯誤處理
})
//會被轉換成為 "SELECT caseid, casedesc, fromper, logdate from cases where caseid = '1' limit 1
cases.findAll({ //資料表名稱為 cases
attributes: ['caseid', 'casedesc', 'fromper', 'logdate'], //回傳欄位陣列
where: { // 查詢條件
caseid: "1"
},
}).then((data) => {
//查詢完成處理,通常我是會建立一個回傳用的陣列,只取出每個元素的 dataValues後回傳
let result = []
for(let i = 0; i < data.length; i++) {
result.push(data[i].dataValues)
}
}).catch((err) => {
//錯誤處理
})
//會被轉換成為 "SELECT caseid, casedesc, fromper, logdate from cases where caseid = '1'
說明:
const Sequelize = require("sequelize")
const op = Sequelize.Op
cases.findAll({
where: {
caseid: "1",
casedesc: {
[op.like]: "%輸入問題%"
}
},
}).then((data) => {
//…
})
//會被轉換成為 "SELECT caseid, casedesc, fromper, logdate from cases where caseid = '1' and casedesc like '%輸入問題%'
說明:
const Sequelize = require("sequelize")
const op = Sequelize.Op
cases.findAll({
attributes: ['caseid'],
where: {
caseid: "1"
},
group: ['caseid'],
order: [
['caseid', 'asc']
]
}).then((data) => {
//…
})
//會被轉換成為 "SELECT caseid from cases where caseid = '1' group by caseid order by caseid
說明:
資料新增之功能,為呼叫 create function,把新增之物件傳入即可,範例如下
let obj = {}
//物件賦值
cases.create(obj)
.then((newobj)=>{
//新增成功
}).catch((err) => {
//錯誤處理
})
說明:
資料更新之功能,為呼叫 update function,範例如下
let upobj = {} //修改的資料
//物件賦值
let whereobj // 條改條件物件
cases.update(updobj, {
where: whereobj
}).then((cnt)=>{
//更新成功
}).catch((err) => {
//錯誤處理
})
說明:
資料刪除之功能,為呼叫 update function,範例如下
let upobj = {} //修改的資料
//物件賦值
let whereobj // 條改條件物件
cases.destory({
where: whereobj
}).then((cnt)=>{
//更新成功
}).catch((err) => {
//錯誤處理
})
說明:
綜合上述之說明,本日先完成顯示客服資料列表的查詢功能,並預留查詢條件的處理功能,供後續之用
'use strict';
const cases = require("./db/cases")
const Sequelize = require("sequelize");
const op = Sequelize.Op
module.exports = {
/**
* 取出客服資料列表
* @param {*} qry 篩選條件
*/
getCases: async(qry)=> {
return new Promise((resolve, reject) => {
let qryobj = {}
if(qry) {
// 處理查詢條件
if(qry.caseid) {
qryobj.caseid = qry.caseid
}
if(qry.casedesc) {
qryobj.casedesc = {[op.like]: "%" + qry.casedesc + "%"}
}
if(qry.fromper) {
qryobj.fromper = {[op.like]: qry.fromper + "%"}
}
}
cases.findAll({
attributes: ['caseid', 'casedesc', 'fromper', 'logdate'],
where: qryobj
})
.then((data) => {
let result = []
for(let i = 0; i < data.length; i++) {
result.push(data[i].dataValues)
//資料超過 50 筆僅取出前 50筆
if(i >= 50) {
break;
}
}
resolve(result)
}).catch((err) => {
reject(err.message)
})
})
}
}
//說明:
如上述程式碼,Sequelize 最方便的地方在於多重條件的處理方式,我們只要調整 qryobj 的內容,就可以做出交叉查詢的功能,相較傳統組合 SQL 語法的做法,Sequelize 是簡單很多的
今天了解了 Sequelize 的資料增、刪、查、改的方式,相較傳統組合 SQL 語法的做法,Sequelize 是簡單很多的,例如交叉查詢功能,不用像使用 SQL 方式去串接 WHERE子句的文字。資料新增、修改時,也不用去核對欄位名稱,串接長長的SQL語法。只要把物件做出來(通常是從前端直接取得後,整個物件傳到 model 中),再加上特定由後端運算產生之資料,傳入 create / update fuction中,即完成資料庫的新增修改,用久了很容易回不去 XDDD。
明天預計正式進入 vue.js 的部份,那我們明天再繼續吧