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