こんな 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()
使うべきなのかも。
参考