Laravel技巧集锦(38):显示私信列表和标记已读私信

1、model

public function fromUser(){
        return $this->belongsTo(User::class,'from_user_id');
    }
    public function toUser(){
        return $this->belongsTo(User::class,'to_user_id');
    }

 public function markAsRead()
    {
        if(is_null($this->read_at)){
            $this->forceFill(['has_read' => 'T' , 'read_at' => $this->freshTimestamp()])->save();
        }
    }

    public function newCollection(array $models = [])
    {
        return new MessageCollection($models); // TODO: Change the autogenerated stub
    }

2、控制器

//list
public function index(){

       $messages = Message::where('to_user_id',\Auth::user()->id)
            ->orWhere('from_user_id',\Auth::user()->id)
            ->with(['fromUser','toUser'])->get();
      
        return view('inbox.index',['messages'=>$messages->unique('dialog_id')->groupBy('to_user_id')]);
    }


//展示私信详情
public function show($dialogId){

        $messages = Message::where('dialog_id',$dialogId)->latest()->get();
       

        $messages->markAsRead(); //标记为已读,使用newCollection
        return view('inbox.show',compact('messages','dialogId'));


    }



//存储回复的私信
    public function store($dialogId)
    {
        $message = Message::where('dialog_id',$dialogId)->first();

        $toUserId = $message->from_user_id === user()->id ? $message->to_user_id: $message->from_user_id;

        Message::create([
            'from_user_id' => user()->id,
            'to_user_id' => $toUserId,
            'body' => \request('body'),
            'dialog_id' => $dialogId
        ]);

        return back();
    }

3、route

Route::get('/inbox','InboxController@index');
Route::get('/inbox/{dialogId}','InboxController@show');
Route::post('/inbox/{dialogId}/store','InboxController@store');

4、app\MessageCollection.php

namespace App;
use Illuminate\Database\Eloquent\Collection;

class MessageCollection extends  Collection
{
    public function markAsRead()
    {
        $this->each(function ($message){
            if ($message->to_user_id === user()->id){ //只有收信人为登录用户时才设置已读状态
                $message->markAsRead();
            }
        });
    }

}

5、私信列表view

   <div class="panel-body">
                        @foreach($messages as $key => $messageGroup)
                            <div class="media">
                                <div class="media-left">
                                    <a href="">
                                        @if(user()->id== $key)
                                        <img width="50" src="{{$messageGroup->first()->fromUser->avatar}}" alt="">
                                        @else
                                         <img width="50" src="{{$messageGroup->first()->toUser->avatar}}" alt="">
                                        @endif
                                    </a>
                                </div>
                                <div class="media-body">
                                    <h4 class="media-heading">
                                        <a href="#">

                                            @if(\Auth::user()->id == $key)
                                            {{$messageGroup->first()->fromUser->name}}
                                            @else
                                             {{$messageGroup->first()->toUser->name}}
                                            @endif
                                        </a>
                                    </h4>
                                    <p>
                                        <a href="/inbox/{{$messageGroup->last()->dialog_id}}">
                                            {{$messageGroup->last()->body}}
                                        </a>
                                    </p>
                                </div>
                            </div>
                        @endforeach
                    </div>


6、私信详情view

     <div class="panel-body">

                        <form action="/inbox/{{$dialogId}}/store" method="post">
                            {{csrf_field()}}
                            <div class="form-group">
                                <textarea name="body" class="form-control"></textarea>
                            </div>
                            <div class="form-group">
                                <button class="btn btn-success pull-right">回复私信</button>
                            </div>

                        </form>

                        <div class="messages-list">
                            @foreach($messages as $key => $message)
                                <div class="media">
                                    <div class="media-left">
                                        <a href="">

                                            <img width="50" src="{{$message->fromUser->avatar}}" alt="">

                                        </a>
                                    </div>
                                    <div class="media-body">
                                        <h4 class="media-heading">
                                            <a href="#">


                                                {{$message->fromUser->name}}

                                            </a>
                                        </h4>
                                        <p>

                                            {{$message->body}}

                                            <span class="pull-right">{{$message->created_at->format('Y-m-d H:i:s')}}</span>
                                        </p>
                                    </div>
                                </div>
                            @endforeach

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值