我会建议:
- 多对多:用户 <-> 对话。A
User
可以有很多Conversation
s,aConversation
由两个或多个User
s组成
- 一对多:用户 <-> 消息。A
Message
属于一个User
。AUser
有很多Message
s
- 一对多:消息 <-> 对话。A
Message
属于一个Conversation
。AConversation
有很多Message
s。
这将为您提供以下 SQL 结构(仅对列出的关系感兴趣的属性):
users: id
messages: id | user_id | conversation_id
conversations: id
conversations_users: conversation_id | user_id
想想像聊天室这样的对话,它基本上是几个用户之间共享的消息集合。
在 Laravel 中,可能的 Eloquent 模型如下所示:
class User extends Eloquent
{
public function conversations()
{
return $this->belongsToMany('Conversation');
}
public function messages()
{
return $this->hasMany('Message'); // not as relevant, because these are all messages across conversations
}
}
class Message extends Eloquent
{
public function user()
{
return $this->belongsTo('User');
}
public function conversation()
{
return $this->belongsTo('Conversation');
}
}
class Conversation extends Eloquent
{
public function messages()
{
return $this->hasMany('Message');
}
public function users()
{
return $this->belongsToMany('User');
}
}
// Users conversations
$conversations = User::find(1)->conversations;
foreach($conversations as $conversation)
{
// All members of conversation
$members = $conversation->users;
// All messages of conversation
$messages = $conversation->messages;
}