【Laravel】既読処理をやりたい
備忘録です
やりたいこと
Laravelで管理者からユーザー全体に送ったお知らせをユーザーが確認した時、既読したことを判断したい
未読のものには未読バッチをつけたりして通知したい(今回は蛇足なので割愛)
テーブル
今回はMySQLで作ってます
お知らせテーブル(notification)
id | int | PRI | NULL | auto_increment |
---|---|---|---|---|
title | varchar(255) | NULL | ||
content | text | NULL | ||
period_start_at | datetime | NULL | ||
period_end_at | datetime | NULL |
既読テーブル(read)
id | int | PRI | NULL | auto_increment |
---|---|---|---|---|
n_id | int | NULL | ||
u_id | int | NULL |
必要なテーブルはお知らせの内容が入っているお知らせテーブルと誰が既読したかを管理する既読テーブル
既読処理
お知らせ一覧画面からお知らせをクリックした時にお知らせの詳細ページに行くようにして
その際に既読処理をしたい
一覧画面や詳細画面は割愛して
処理だけ書きます
NotificationController.php
<?php namespace App\Http\Controllers\User; use Illuminate\Support\Facades\Auth; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\DB; class NotificationController extends Controller{ public function read($n_id){ $u_id= Auth::id(); $readedCheck = DB::table('read')->whereRaw('n_id = ? and u_id = ?' , array($n_id,$u_id))->exists(); if($readedCheck == null){ DB::table('read')->insert( ['u_id' => $u_id, 'n_id' => $n_id] ); } } }
<?php DB::table('read')->whereRaw('n_id = ? and u_id = ?' , array($n_id,$u_id))->exists();
これでクリックしたお知らせをユーザーがすでに既読しているかどうかを判別しています
判別して未読だった場合
ユーザーのidとお知らせのidをレコードに追加します
おまけ
今回作ったお知らせには公開開始期間と公開終了期間が設けており公開終了期間が過ぎたら一覧画面から消える仕組みになっています
公開終了期間が過ぎたお知らせの既読情報を持つ必要はないので終了期間が過ぎたもののレコードは削除するようにします
<?php $u_id= Auth::id(); $periodEndNotificaitons = DB::table('notification')->where('period_end_at','<',$today = new Carbon(Carbon::now()))->get(); foreach($periodEndNotificaitons as $end){ if(DB::table('read')->where('n_id',$end->id)->where('u_id',$u_id)){ DB::table('read')->where('n_id',$end->id)->where('u_id',$u_id)->delete(); } }
お知らせテーブルの公開終了日時(period_end_at)と今の日時を比較して公開期間が終了したものを抽出
抽出したものをforeachで一つずつ回して既読テーブルにあるものは削除します
もっとスタイリッシュにするやり方があるかもしれませんが自分が考えたやり方をご紹介しました