Sequelizeでインクリメント・デクリメントする方法

データ

以下のようなデータを入れたUsersテーブルを作成します。モデル名はUserです。

id name booksCount createdAt updatedAt
1 郷田 1 2019-03-20 21:58:30 2019-03-20 21:58:30

このbooksCountの値に対して変更を加えていきます。

インクリメント

booksCountに1プラスします。

'use strict';

const db = require('./models/index')

db.User
  .increment('booksCount', {where: { id: 1 }})
  .then(()=>{
    db.sequelize.close()
  })

SQL

Executing (default): UPDATE `Users` SET `booksCount`=`booksCount`+ 1,`updatedAt`='2019-03-20 22:03:01' WHERE `id` = 1

updatedAtも同時に更新されています。

実行前

id name booksCount createdAt updatedAt
1 郷田 1 2019-03-20 21:58:30 2019-03-20 21:58:30

実行後

id name booksCount createdAt updatedAt
1 郷田 2 2019-03-20 21:58:30 2019-03-20 22:03:01

デクリメント

booksCountから1マイナスします。

'use strict';

const db = require('./models/index')

db.User
  .decrement('booksCount', {where: { id: 1 }})
  .then(()=>{
    db.sequelize.close()
  })

SQL

Executing (default): UPDATE `Users` SET `booksCount`=`booksCount`- 1,`updatedAt`='2019-03-20 22:05:05' WHERE `id` = 1

updatedAtも同時に更新されています。

実行前

id name booksCount createdAt updatedAt
1 郷田 2 2019-03-20 21:58:30 2019-03-20 22:03:01

実行後

id name booksCount createdAt updatedAt
1 郷田 1 2019-03-20 21:58:30 2019-03-20 22:05:05

デクリメント(マイナスにならないようにする)

デクリメント時にマイナスにならないようにするにはwhereでの条件を追加します。

'use strict';

const db = require('./models/index')
const Op = db.Sequelize.Op

db.User
  .decrement('booksCount', {where: { id: 1 , booksCount: {[Op.gt]: 0}}})
  .then(()=>{
    db.sequelize.close()
  })

SQL

Executing (default): UPDATE `Users` SET `booksCount`=`booksCount`- 1,`updatedAt`='2019-03-20 19:54:45' WHERE `id` = 1 AND `booksCount` > 0

2以上の値を加える

booksCountに2プラスします。

'use strict';

const db = require('./models/index')
const Op = db.Sequelize.Op

db.User
  .increment('booksCount', {by: 2, where: { id: 1 }})
  .then(()=>{
    db.sequelize.close()
  })

SQL

Executing (default): UPDATE `Users` SET `booksCount`=`booksCount`+ 2,`updatedAt`='2019-03-20 22:07:37' WHERE `id` = 1

実行前

id name booksCount createdAt updatedAt
1 郷田 1 2019-03-20 21:58:30 2019-03-20 22:05:05

実行後

id name booksCount createdAt updatedAt
1 郷田 3 2019-03-20 21:58:30 2019-03-20 22:07:37

2以上の値を減らす

booksCountに2マイナスします。

'use strict';

const db = require('./models/index')
const Op = db.Sequelize.Op

db.User
  .decrement('booksCount', {by: 2, where: { id: 1 }})
  .then(()=>{
    db.sequelize.close()
  })

SQL

Executing (default): UPDATE `Users` SET `booksCount`=`booksCount`- 2,`updatedAt`='2019-03-20 22:10:27' WHERE `id` = 1

実行前

id name booksCount createdAt updatedAt
1 郷田 3 2019-03-20 21:58:30 2019-03-20 22:07:37

実行後

id name booksCount createdAt updatedAt
1 郷田 1 2019-03-20 21:58:30 2019-03-20 22:10:27

updatedAtを更新しない

silentというオプションがあるのでこちらをtrueにします。

'use strict';

const db = require('./models/index')
const Op = db.Sequelize.Op

db.User
  .increment('booksCount', {where: { id: 1 }, silent: true})
  .then(()=>{
    db.sequelize.close()
  })

SQL

Executing (default): UPDATE `Users` SET `booksCount`=`booksCount`+ 1 WHERE `id` = 1

実行前

id name booksCount createdAt updatedAt
1 郷田 1 2019-03-20 21:58:30 2019-03-20 22:10:27

実行後

id name booksCount createdAt updatedAt
1 郷田 2 2019-03-20 21:58:30 2019-03-20 22:10:27

参照