【laravel】incrementでupdated_atを更新しない方法

製作 プログラム

最終更新日:2024/08/21

ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.

2024年8月21日追記

下ではあーだこーだ言っていますがこっちの方が簡単でした。

$post->timestamps = false;
$post->pv++;
$post->save();
$post->timestamps = true;

「timestamps」に「false」で一時的にupdated_atの更新をしなようにして、save()後、再び「timestamps」のもともとの値である「true」を入れてあげればOK。

これで続くbladeとかでupdated_atを使う場合でも問題なく値が取れます(laravelにおける「timestamps」の値はtrue/falseで、ここには実際の時間情報は入っていません。実際の時間情報はそれぞれcreated_atやupdateda_atに格納されています)。

— 追記終わり ———————-


laravelでたとえばPVをカウントしたりするとき、increment使いやすいですよね。

$post->increment('pv');みたいに一行書くだけでそのカラム(今回の場合だとpvカラム)の値を1増やしてくれて、save()まで同時にしてくれます。

ただ一つ問題があって、この時にupdated_atの値も更新されちゃうんですよね。incrementって。

今回のようなpostテーブルのpvを更新した時って、別に記事自体を書き直したわけじゃないのでそれでupdated_atが更新されてしまうとよろしくありません。

こんな風にupdated_atを更新したくない時、巷でよく言われているやり方として、

$post->timestamps = false;
$post->pv++;
$post->save();

とする方法があります。

ただこれだとその後の処理でcreated_atやupdated_atが使えない(falseしてるんで当然ですが)ので、コントローラーでpvを計測してからbladeで記事を表示してる場合、記事表示の時に日時が表示できずエラーになっちゃって上手くいかないんですよね。

というコトでここではlaravelでupdated_atを更新しないでincrementを使う方法を紹介しますね。

これでOK!

$post->increment('pv', 1, ['updated_at' => $post->updated_at]);

incrementの第2引数、第3引数を使うコトでこの問題が解決出来ちゃいます。

ただ、これはよーく読めば公式ドキュメントに書かれている方法ですので、皆さんすでに知っているのかもしれませんね。

ちなみにですがincrementの第2引数は「どれだけ増やすか」という数字。今回は1だけ増やしてるコトになりますし、ここにたとえば5って書けばすでに入ってるカラムの値に5が加算されます。また第3引数を与えたいので仕方なく第2引数も書いてます。

incrementの第3引数が同時に更新(update)するカラムを指定している部分。ここで明示的に「updated_atの値は今のこのpostが持ってるupdated_atの値にして!」とやってるのが今回のキモ。

まとめ

ここではlaravelのincrementでupdated_atを更新しない方法を紹介しました。

冒頭で書いた「timestamps = false」の方法でも普通なら大丈夫なんですが、その後の処理でcreated_atやupdated_atの値を表示したりするならうまくいかないので、公式ドキュメントにあるようにincrementするタイミングで第3引数を設定して上げればOK!という感じ。

参考にしてみてくださいね。

【おしらせ、というか完全なる宣伝】

文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.

こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /