对话,多对多关系

Pat*_*eck 4 laravel eloquent laravel-4

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

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

拥有以下模型:Conversation,UserMessage,我想象下面的表:

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

消息: id | message | conversation_id | user_id

这是正确的方法吗?它会user1_iduser2_id桌面一起使用吗?

Fel*_*lix 9

我会建议:

  • 多对多:用户< - >对话.A User可以有多个Conversations,一个Conversation由两个或更多个Users组成
  • 一对多:用户< - >消息.A Message属于一个User.一个User有很多Message小号
  • 一对多:消息< - >对话.A Message属于一个Conversation.A Conversation有很多个Message.

这将为您提供以下SQL结构(仅对列出的关系感兴趣的属性):

users: id
messages: id | user_id | conversation_id
conversations: id
conversations_users: conversation_id | user_id
Run Code Online (Sandbox Code Playgroud)

想想聊天室之类的对话,它基本上是几个用户之间的一个共享消息集合.

在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;
}
Run Code Online (Sandbox Code Playgroud)