LoginSignup
6
2

More than 1 year has passed since last update.

CakePHP 4 の UPDATE 文で 数値をインクリメントしたい場合

Last updated at Posted at 2020-10-16

こんな UPDATE 文を書きたいときにどうすればええんじゃー!となって解決したので書いときます。

UPDATE 文

よくある set hoge = hoge+1 的なやつです。

UPDATE 
  borad_members 
SET 
  unread_count = unread_count + 1, 
  changed = '2020-10-16 13:17:48' 
WHERE 
  borad_id = 1 
AND user_id != 3

要件

メッセージをやり取りする board があったとします。
新規メッセージが投稿された際に、投稿されたメッセージの未読数を各ユーザーごとにインクリメントしたかったりするかもしれません。

別にこの要件でなくてもいいんですが、なんかより現実味のあるものにしたくて実際にサンプルコードを書いて動かしました。

コード

src/Model/Table/BoardMembersTable.php があるとします。
QueryExpression オブジェクトを予め組み立ててクエリを作っていきます。
Carbon 大好きなので日付処理はほとんど Carbon 任せです。

$query = $this->query();
$increment = $query->newExpr()->add('unread_count + 1');

$result = $query->update()
    ->set([
        'unread_count' => $increment,
        'changed' => Carbon::now(),
    ])
    ->where([
        'board_id' => $boardId,
        'user_id !=' => $userId,
    ])
    ->execute();

所感

CakePHP 2 だと別の書き方でできてた気がするんですが(忘れた)、現在僕が開発に使用している CakePHP 4 では使えなかったので「一体どうやるんじゃー」となって「あ、そういえば between したかった時に QueryExpression オブジェクト使ったわ」って思い出して書いたのでした。

ググってもサンプルが見つからなかった(QueryExpression オブジェクトの使い方は 公式 含めいろいろあった)のでエントリーにしてみました。

参考になれば幸いです。

所感2

!= も厳密にいえば notEq() 使うべきなのかも。

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2