答え
touch()メソッドを使います。たとえば、下記のようにします。
Laravel
$item = Post::find(1);
$item->touch();
上記コードによって下記のクエリーが実行されます。
SQL
update posts set updated_at = '2022-08-15 09:21:04' where id = 1
使いどころ
下記のようなリレーションのテーブルがあったとします。
postsは記事テーブル、tagsは記事に関連するタグテーブルと考えてください。
管理画面で
- タイトル
- 内容
- 関連タグ
を編集する機能にて、タイトルと内容はそのままで関連タグのみ変更する場合、下記のようなコードではpostsのupdated_atが更新されません。
Laravel
$item = Post::find($request->id);
$item->title = $request->title;
$item->contents = $request->contents;
item->save();
記事の一覧画面が更新順に表示されるようになっている場合、さっき更新したのに一番上にあがってこない、なんで??、という状況になります。
そこでtouch()です。
Laravel
$item = Post::find($request->id);
$item->title = $request->title;
$item->contents = $request->contents;
$item->save();
$item->touch();
ちなみに save() で updated_at が更新された場合(つまりタイトルか内容が更新された場合)は touch() による UPDATEクエリーは発行されません。
さすがLaravelといったところです。
別案
update() であれば内容が変わっていなくても update_at を更新することができます。
Laravel
Post::where('id', $request->id)
->update([
'title' => $request->title,
'contents' => $request->contents,
]);