Прежде всего, вы должны определить отношение Диалог с такими сообщениями:
Модель разговора
public function messages()
{
return $this->hasMany('App\Message');
}
Вы должны также определить обратную зависимость:
Модель сообщения
public function conversation()
{
return $this->belongsTo('App\Conversation');
}
Вы можете показать все разговоры пользователя с кодом ниже:
public function getConversations($userId)
{
$conversations = Conversation::where('sender_id',$userId)->orWhere('receiver_id',$userId);
return view('yourview', compact('conversations'));
}
По вашему мнению, вы можете зацикливаться и находить каждое сообщение из каждого разговора:
@foreach($conversations as $conversation)
@foreach($conversation->messages as $message)
{{$message->message}}
@endforeach
@endforeach
В вашей таблице conversations
может быть user_id
FK, также ваши отношения должны выглядеть следующим образом:
Модель пользователя
public function conversations()
{
return $this->hasMany('App\Conversation', 'user_id');
}
Примечание: вы также можете использовать receiver_id
или sender_id
в качестве внешнего ключа.
С этим отношением вы можете получить все разговоры от пользователя с этим:
$user = User::find($id);
$user->conversations; // This will return all conversations from that user
Вы также можете получить все сообщения от пользователя, используя отношение Имеет много через :
public function messages()
{
return $this->hasManyThrough('App\Message', 'App\Conversation');
}
Другой подход
Еще один способ сделать это - создать сводную таблицу между users
и conversations
.
Таблица conversation_user
id
user_id
conversation_id
Таким образом, у пользователя может быть много разговоров ( Отношение много ко многим ).
Вы можете изменить таблицу messages
на:
id
conversation_id
receiver_id
sender_id
content
...
Ваше Сообщение Модель
public function conversation()
{
return $this->belongsTo('App\Conversation', 'conversation_id');
}
Модель пользователя
public function conversations()
{
return $this->belongsToMany('App\Conversation');
}
The Диалог Модель
public function users()
{
return $this->belongsToMany('App\User');
}
public function messages()
{
return $this->hasMany('App\Message');
}
Я думаю, что это лучший способ сделать это
Если вы хотите получить разговор и сообщения:
$user = User::find($id);
foreach($user->conversations as $conversation)
{
foreach($conversation->messages as $message)
{
echo $message->content;
}
}
Еще один простой способ сделать это - использовать модель сообщения:
$userMessages = Message::where('receiver_id', $userId)->orWhere('sender_id',$userId)->get();
Но таким образом вы будете получать только сообщения, вы можете найти разговор с этим:
foreach($userMessages->conversation as $conversation)
{
echo $conversation;
}