我正在开发一个应用程序,我需要用户使用类似聊天的系统互相交流。
为此,我想创建一个Conversation
模型。据我所知,我将使用多对多关系。
拥有以下模型:Conversation
,User
和Message
,我想到了以下表格:
对话:id | user1_id | user2_id
- 我不确定Laravel是否理解编号的用户ID
id | message | conversation_id | user_id
这是正确的方法吗?它是否适用于user1_id
和user2_id
表?
答案 0 :(得分:9)
我建议:
User
可以包含多个Conversation
个,Conversation
包含两个或更多个User
s Message
属于User
个User
。 Message
有许多Message
s Conversation
属于Conversation
个Message
。 users: id
messages: id | user_id | conversation_id
conversations: id
conversations_users: conversation_id | user_id
有许多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;
}
s。这将为您提供以下SQL结构(仅对列出的关系感兴趣的属性):
{{1}}
考虑聊天室之类的对话,它基本上是一对用户之间共享的一组消息。
在Laravel中,可能的Eloquent模型看起来像这样:
{{1}}
答案 1 :(得分:2)
您的留言表应如下所示:
MessageID PK
ConversationID FK
UserID FK
ReplyToMessageID FK <--- Track responses
Message String
User1ID和User2ID是反模式。如果三个用户参与对话怎么办?还是四个?
在Message表中建立关系会保留您的多对多信息,但会保持对话和消息,用户和消息之间的关系,一对多。
您不需要两个用户表,只需一个。