我正在尝试使用 laravel 8 获取消息发件人的姓名
I am trying to get the name of the message sender using laravel 8
我正在使用 laravel 构建一个简单的私人聊天应用程序。
我有一条消息 table,其中有一列:id/sender_id/receiver_id 和正文
请告诉我如何获得消息发件人的姓名?。我尝试了以下请给我解决方案。
注意:- 实际上消息接收者并没有收到消息发送者的姓名。当发件人消息将消息发送给接收者时,接收者正在获取消息接收者的名称而不是消息发送者的名称。
控制器
$conservation = Message::where(function ($q) {
$q->where('sender_id', Auth::user()->id)
->orWhere('receiver_id', Auth::user()->id);
})->where(function ($q) {
$q->where('sender_id', $this->selectedUser->id)
->orWhere('receiver_id', $this->selectedUser->id);
})->get();
消息模型
public function sender()
{
return $this->belongsTo(User::class,'sender_id');
}
public function receiver()
{
return $this->belongsTo(User::class,'receiver_id');
}
用户Table
public function receiver(){
return $this->hasMany(Message::class);
}
public function sender()
{
return $this->hasMany(Message::class);
}
html 查看
@foreach ($conservation as $message)
<div class="message-area p-3 ">
<div class="date border-bottom text-center my-3"><span class="bg-white px-3">
</span>{{$message->created_at->format('d-m-Y') }}</div>
<div class="d-flex">
@if ($message->sender_id === Auth::user()->id)
<b><p>{{$message->receiver->full_name}}</p></b>
@else
<b><p>{{$message->sender->full_name}}</p></b>
@endif
<div class="message-text ms-3">
<div>{{$message->body}}</div>
</div>
</div>
</div>
@endforeach
已编辑:
首先,您需要将 receiver_id 从 client-side 发送到您的后端 ($receiver_id)。
那么这段代码会考虑两个条件:1)你是接收者,正在查看发送者的消息页面。 2) 您是发件人,正在查看收件人的消息页面。
return Message::query()
->where('sender_id', Auth::id())
->where('receiver_id', $receiver_id)
->orWhere('receiver_id', Auth::id())
->where('sender_id', $receiver_id)
->with('sender')
->with('receiver')
->get();
然后你需要在你的客户端代码中添加一些基于认证用户id的If条件。[=11=]
像这样的东西应该工作得很好。
Message::query()
->where('receiver_id', $user_id)
->with('sender')
->get();
如果你想优化查询,可以有这个
Message::query()
->where('receiver_id', $user_id)
->with('sender:id,first_name,last_name')
->get();
我假设您有 first_name
、last_name
列。如果您没有,可以用您的名字替换它们 column/columns.
在我看来,出于性能原因,您还应该对消息进行分页。像这样获取所有消息可能会非常昂贵,因为消息可能太多了。
我正在使用 laravel 构建一个简单的私人聊天应用程序。
我有一条消息 table,其中有一列:id/sender_id/receiver_id 和正文
请告诉我如何获得消息发件人的姓名?。我尝试了以下请给我解决方案。
注意:- 实际上消息接收者并没有收到消息发送者的姓名。当发件人消息将消息发送给接收者时,接收者正在获取消息接收者的名称而不是消息发送者的名称。
控制器
$conservation = Message::where(function ($q) {
$q->where('sender_id', Auth::user()->id)
->orWhere('receiver_id', Auth::user()->id);
})->where(function ($q) {
$q->where('sender_id', $this->selectedUser->id)
->orWhere('receiver_id', $this->selectedUser->id);
})->get();
消息模型
public function sender()
{
return $this->belongsTo(User::class,'sender_id');
}
public function receiver()
{
return $this->belongsTo(User::class,'receiver_id');
}
用户Table
public function receiver(){
return $this->hasMany(Message::class);
}
public function sender()
{
return $this->hasMany(Message::class);
}
html 查看
@foreach ($conservation as $message)
<div class="message-area p-3 ">
<div class="date border-bottom text-center my-3"><span class="bg-white px-3">
</span>{{$message->created_at->format('d-m-Y') }}</div>
<div class="d-flex">
@if ($message->sender_id === Auth::user()->id)
<b><p>{{$message->receiver->full_name}}</p></b>
@else
<b><p>{{$message->sender->full_name}}</p></b>
@endif
<div class="message-text ms-3">
<div>{{$message->body}}</div>
</div>
</div>
</div>
@endforeach
已编辑: 首先,您需要将 receiver_id 从 client-side 发送到您的后端 ($receiver_id)。 那么这段代码会考虑两个条件:1)你是接收者,正在查看发送者的消息页面。 2) 您是发件人,正在查看收件人的消息页面。
return Message::query()
->where('sender_id', Auth::id())
->where('receiver_id', $receiver_id)
->orWhere('receiver_id', Auth::id())
->where('sender_id', $receiver_id)
->with('sender')
->with('receiver')
->get();
然后你需要在你的客户端代码中添加一些基于认证用户id的If条件。[=11=]
像这样的东西应该工作得很好。
Message::query()
->where('receiver_id', $user_id)
->with('sender')
->get();
如果你想优化查询,可以有这个
Message::query()
->where('receiver_id', $user_id)
->with('sender:id,first_name,last_name')
->get();
我假设您有 first_name
、last_name
列。如果您没有,可以用您的名字替换它们 column/columns.
在我看来,出于性能原因,您还应该对消息进行分页。像这样获取所有消息可能会非常昂贵,因为消息可能太多了。