我试图通过创建消息传递应用程序来理解laravel。用户应该能够相互发送消息。我使用核心php制作了类似的应用程序。
我完成了登录/身份验证和迁移,现在坚持在模型中定义关系;
我使用迁移创建了3个表:
这是以下架构:
用户表(用于存储用户的详细信息)
$table->increments('id');
$table->string('username', 50);
$table->string('password', 50);
$table->string('name', 50);
$table->string('email', 254);
$table->timestamps();
对话表(用于存储用户之间的对话)
$table->increments('id');
$table->integer('user_one'); //foreign key of one friend from users table
$table->integer('user_two'); //foreign key of second friend from users table
$table->string('ip');
$table->timestamps();
conversations_reply table(用于存储对话文本)
$table->increments('id');
$table->text('reply');
$table->integer('user_id');
$table->integer('conversation_id'); //foreign key of conversations table
$table->string('ip');
$table->timestamps();
现在,我试图在模型中定义关系:
User
模型与Conversation
和ConversationReply
模型之间存在 hasMany 关系。Conversation
将与User
模型建立 belongsToMany 关系,并与 ConversationReply 模型建立 hasMany 关系。ConversationReply
模型与User
和Conversation
模型的 belongsToMany 关系。现在我坚持在第一个模型(用户)中定义关系而无法继续进行,因为我需要定义本地和外键,但我无法这样做因为会话表会有2个外键(2个用户),我只能定义一个外键。
编辑:对话中应该只有两个成员,而且两个用户应该只有一个对话(比如facebook)。他们的新消息应该添加到旧的对话中。在对话表中,ip是将启动对话的用户的ip地址,在conversations_reply表中,ip是用户的相应ip
答案 0 :(得分:1)
你的抽象似乎有一点缺陷。您实际上已将user1和user2设计为Conversation实体的 attributes ,但它们不是属性。另外,会话的IP是什么?
对话的属性可以是主题,开始时间,结束时间,消息量等等。
然后会话中有成员。不完全是两个,但很多。所以你可以创建一个连接用户和对话的实体/模型 ConversationMembers :
conversation_members表:
$table->increments('id');
$table->integer('conversation_id');
$table->integer('user_id');
$table->string('ip');
$table->string('nickname');
并相应地更改对话表:
$table->increments('id');
$table->boolean('public);
// other attributes you're interested in
$table->timestamps();
现在您可以在模型上定义关系:
<强>会话:强>
public function members()
{
return $this->hasMany('ConversationMember');
}
public function messages()
{
return $this->hasMany('ConversationReply');
}
<强> ConversationMember:强>
public function user()
{
return $this->belongsTo('User');
}
public function conversation()
{
return $this->belongsTo('Conversation');
}
用户:强>
public function conversations()
{
return $this->hasManyThrough('Conversation', 'ConversationMember');
}
public function replies()
{
return $this->hasMany('ConversationReply');
}
我希望这会有所帮助。