がんばるぞ

がんばります

【相談】Eloquent/QueryBuilderでカラムの値をincrementする書き方が知りたい

僕は個人的に初心者エンジニアからのお悩み相談を受け付けていて
以前、以下のようなツイートをしたのですが

まぁこれが出会い厨に見えると。
友人からそういった指摘を受けまして

それの対策として、ちゃんと相談に答えている風景を公開するのはどうかという案をもらったので、これからはそうしたいと思います!!!! (もちろん許可は取ります)




相談者:
相談に乗っていただける旨のツイートを拝見し、DMさせていただきました。

現在、Laravelでアプリを作成中なのですがわからないことがあり、詰まっています!

記事テーブルに、iine_countカラム(integer) があり、ある記事にいいねをすると
その記事のiine_countを+1するクエリビルダorエロクエントの書き方を教えていだけないでしょうか。


吉田あひる:
なるほどー

ちなみに質問の背景は、

  1. どういうSQLを発行すれば目的が達成されるのかわからない
  2. SQLはわかるがQueryBuilderを使った書き方がわからない

のどちらでしょうか?


相談者:
1番です!


吉田あひる:
了解しました!

Eloquentを使用していると、SQLの知識が抜けがちになってしまって、学習のバランスが難しいですよね!

ただ単純に値を+1するだけであれば、以下のようなSQLを出力できればOKだと思います。

UPDATE posts
   SET iine_count = iine_count + 1
 WHERE post_id = ?

取得できたレコードの iine_count の値に +1 をして再代入してる感じですね
UPDATE文について詳しくはこちらを参照すると良いと思います!

また、テーブルに更新日時のカラムなどがある場合は、SET句に追加で
update_at = YYYY-MM-DD HH:MM:SS
みたいに追記する必要があるかもしれません *1

で、さらにじゃあこれをEloquent/QueryBuilderでどうやるのかというと
Laravelのドキュメントにやり方が載っていまして

<?php
Post::where('id', $postId)->increment('iine_count');

のようにすれば、最初に書いたようなクエリが発行されるんじゃないかなと思います


ちなみに僕の書いたSQLのフォーマットはこちらのスタイルガイドを参考にしています


で、これはちょっと話が大きくなってしまうのでアレなのですが
Postsテーブルにいいねの数を記録できればいいだけではなく、誰がいいねをしたのかというデータも必要になった場合は
今のデータの持ち方だと実現出来ないと思うので、その時はまたテーブル設計の仕方を考えてみると良いと思います!


相談者:
すごく丁寧にありがとうございます。。。😭
やってみます!


吉田あひる:
はーい!がんばってみてください!
自力でアプリケーションを書くのはものすごく勉強になるので、応援してます!!

また何かわからないことがあれば気軽にご連絡ください!




はい、こんな感じで相談にのってますので、みなさんお気軽にご相談ください!!!
(間違った回答をする可能性はめっちゃあるので、鵜呑みにはしない方がよいですけどね!!!!)

おわり

*1:カラムに更新時のタイムスタンプの更新が定義がされてない場合 https://dev.mysql.com/doc/refman/5.6/ja/timestamp-initialization.html