我正在尝试使用 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_namelast_name 列。如果您没有,可以用您的名字替换它们 column/columns.

在我看来,出于性能原因,您还应该对消息进行分页。像这样获取所有消息可能会非常昂贵,因为消息可能太多了。