ディズニーに魂を売ったエンジニア

Twitterにまとまりきらないことを書き連ねる場所

【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で一つずつ回して既読テーブルにあるものは削除します





もっとスタイリッシュにするやり方があるかもしれませんが自分が考えたやり方をご紹介しました