坚持在laravel 4中定义关系

时间:2014-03-28 12:33:56

标签: laravel

我试图通过创建消息传递应用程序来理解laravel。用户应该能够相互发送消息。我使用核心php制作了类似的应用程序。

我完成了登录/身份验证和迁移,现在坚持在模型中定义关系;

我使用迁移创建了3个表:

  1. 用户
  2. 会话
  3. conversations_reply
  4. 这是以下架构:

    1. 用户表(用于存储用户的详细信息)

      $table->increments('id');
      
      $table->string('username', 50);
      $table->string('password', 50);
      $table->string('name', 50);         
      $table->string('email', 254);
      
      $table->timestamps();
      
    2. 对话表(用于存储用户之间的对话)

      $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();
      
    3. 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();
      
    4. 现在,我试图在模型中定义关系:

      1. User模型与ConversationConversationReply模型之间存在 hasMany 关系。
      2. Conversation将与User模型建立 belongsToMany 关系,并与 ConversationReply 模型建立 hasMany 关系。
      3. ConversationReply模型与UserConversation模型的 belongsToMany 关系。
      4. 现在我坚持在第一个模型(用户)中定义关系而无法继续进行,因为我需要定义本地和外键,但我无法这样做因为会话表会有2个外键(2个用户),我只能定义一个外键。

        编辑:对话中应该只有两个成员,而且两个用户应该只有一个对话(比如facebook)。他们的新消息应该添加到旧的对话中。在对话表中,ip是将启动对话的用户的ip地址,在conversations_reply表中,ip是用户的相应ip

1 个答案:

答案 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');
}

我希望这会有所帮助。