对话,多对多关系

时间:2013-06-10 19:28:05

标签: laravel laravel-4 eloquent

我正在开发一个应用程序,我需要用户使用类似聊天的系统互相交流。

为此,我想创建一个Conversation模型。据我所知,我将使用多对多关系。

拥有以下模型:ConversationUserMessage,我想到了以下表格:

对话:id | user1_id | user2_id - 我不确定Laravel是否理解编号的用户ID

消息:id | message | conversation_id | user_id

这是正确的方法吗?它是否适用于user1_iduser2_id表?

2 个答案:

答案 0 :(得分:9)

我建议:

  • 多对多:用户< - >会话。 User可以包含多个Conversation个,Conversation包含两个或更多个User s
  • 一对多:用户< - >信息。 Message属于UserUserMessage有许多Message s
  • 一对多:消息< - >会话。 Conversation属于ConversationMessageusers: 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表中建立关系会保留您的多对多信息,但会保持对话和消息,用户和消息之间的关系,一对多。

您不需要两个用户表,只需一个。

相关问题