4

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

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

拥有以下模型:和Conversation,我想象了以下表格:UserMessage

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

留言:id | message | conversation_id | user_id

这是正确的方法吗?它可以与user1_idanduser2_id表一起使用吗?

4

2 回答 2

10

我会建议:

  • 多对多:用户 <-> 对话。AUser可以有很多Conversations,aConversation由两个或多个Users组成
  • 一对多:用户 <-> 消息。AMessage属于一个User。AUser有很多Messages
  • 一对多:消息 <-> 对话。AMessage属于一个Conversation。AConversation有很多Messages。

这将为您提供以下 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;
}
于 2013-06-10T19:53:21.110 回答
2

您的消息表应如下所示:

MessageID         PK
ConversationID    FK
UserID            FK
ReplyToMessageID  FK       <--- Track responses
Message           String

User1ID 和 User2ID 是一种反模式。如果对话中涉及三个用户怎么办?还是四个?

在消息表中保存您的关系可以保留多对多信息,但会保持对话和消息以及用户和消息之间的关系,一对多。

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

于 2013-06-10T19:30:40.177 回答