about 2 years ago

系列文一
系列文二
系列文三
前一篇主要紀錄了基本的操作,這一篇主要分享如何新增、搜尋、更新與刪除(CRUD)
首先創建Table,這次情境主要是 神奇寶貝商品,內容包含名稱、上架日期、價格、狀態與分類
*PS.以下code都是用pormise串接起來,如有不懂請職看源碼-test2.js

Create

最基本的創建,總共有三種方式
1. 使用build和save
build會先創建Sequelize的DAO(Data Access Object),此時DB內不會有記錄,如果要儲存到DB中使用save

let item = Item.build({name:'比雕',price:'250',onShelfDate:'2014-07-11',status:'1',category:'monster'})
    return item.save();

2. 使用create

return Item.create({name:'卡比獸',price:'30',onShelfDate:'2015-07-11',status:'1',category:'monster'});

3. 使用bulkCreate
如果要一次創建大量物件,可以使用bulkCreate,會resolve回陣列

return Item.bulkCreate([
        {name:'皮卡丘',price:'25',onShelfDate:'2015-07-11',status:'1',category:'monster'},
        {name:'水箭龜',price:'45',onShelfDate:'2016-07-11',status:'1',category:'monster'},
        .......
    ]);
Search相關

接著是搜尋,Sequelize提供大量的搜尋function,像是findOnefindOrCreatefindAndCountAllmax...,使用上蠻直觀的
詳細參考官方文件-搜尋篇
這邊主要記錄 如何設定where條件scope
1. Search with where
wherejson物件中設立多個條件會用And串接,如果要用Or可以使用$or[{條件一}、{條件二}...],更多的設定可以參考官方文件-where operator
實例一

//價格高於50元的神奇寶貝,並且只顯示名稱和價格

return Item.findAll({
        where:{
            price:{
                $gt: 50
            },
            category:{
                $like: 'monster'
            }
        },
        order:'name DESC',
        attributes: ['name','price']    
})

結果:[{"name":"比雕","price":250},{"name":"妙蛙花","price":80},{"name":"噴火龍","price":100}]

實例二-這裡使用到了sequelize.fn,fn可以轉為Database方程式,我這邊用來改變date format,變成SQL就是date_format(onShelfDate,'%Y')='2015'

找出2015上架的商品,並計算價格總和
return Item.sum('price',{
        where: sequelize.where(sequelize.fn('date_format', sequelize.col('onShelfDate'), '%Y'),'2016')
});
Update

可以直接對Sequelize DAO做update或是向下附使用Model+where,promise會返回所影響的列數

Item.update(
    { status:false },
    { where:{ category:'food' } }
)
Delete

return nothing

Item.destroy(
        { where:{ status:false } }
    )

基本的CRUD都看完了,但假設 我想要設立一個api,呼叫後會自動清除過期的產品,但每次都要設where好像有點麻煩,尤其如果多張Table彼此關聯要做到這件事就更麻煩了(詳見第三篇),Sequelize很貼心設計了scope,在創建DAO時就可以設定scope應對不同的使用場景

Scope

Scope定義在Table的option中,可以設置defaultScopescopes,不過目前outdate不能使用,scope中使用fn有BUG!

scopes:{
        outdate:{
            where:sequelize.where(sequelize.fn('date_format', sequelize.col('onShelfDate'), '%Y'),{$lt:'2015'})
        },
        delete:{
            where:{
                status:false
            }
        },
        priceHigher:function(value){
            return {
                where: {
                    price: {
                        $gte: value
                    }
                }
            }
        }
    }

相對應的使用方式,scope中可以包含多個scope,彼此會用AND連接,另外scope可以傳入變數真的是很方便啊!大大提升可重複性

//使用scope顯示價格高於X元的商品

return Item.scope({ method: ['priceHigher', 2000]}).findAll();
//使用scope刪除status為false的商品

return Item.scope('delete').destroy({where:{}});
← RSA加密延伸 - SSH / TLS實踐 Sequelize - NodeJS MySQL ORM module 實戰三:複雜的關聯 →
 
comments powered by Disqus