我正在开发一个应用程序,我需要用户使用类似聊天的系统相互交互。
为此,我想创建一个对话
模型。据我所知,我将使用多对多关系。
具有以下模型:Conversation
、User
和 Message
,我想象了下表:
对话:id |用户1_id | user2_id
- 我不确定 Laravel 是否能理解正在编号的用户 ID
消息:id |留言 |对话 ID | user_id
这是正确的方法吗?它可以与 user1_id
和 user2_id
表一起使用吗?
最佳答案
我建议:
- 多对多:用户<->对话。一个
User
可以有多个Conversation
,一个Conversation
由两个或多个User
组成 - 一对多:用户<->消息。一条
消息
属于一个用户
。一个用户
有许多消息
- 一对多:消息<->对话。一条
消息
属于一个对话
。一个对话
有许多消息
。
这将为您提供以下 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;
}
关于laravel - 对话,多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031312/