Laravel 4关系:消息传递系统

时间:2014-08-21 14:39:22

标签: laravel many-to-many relationship messaging

我遵循了用户ehp的建议,以构建轻量级的消息传递系统:

https://stackoverflow.com/a/18717864/1084315

Users: id | username

Messages: id | from | content

user_messages: user_id | message_id



class User extends Eloquent {

  public function messages()
  {
    return $this->belongsToMany('Message');
  }

  public function sent_messages()
  {
    return $this->hasMany('Messages', 'from');
  }

}

class Message extends Eloquent {

  public function from()
  {
    return $this->belongsTo('User', 'from');
  }

public function to()
  {
    return $this->belongsToMany('User');
  }
}

我创建了这样的消息:

User::find(2)->messages()->create(array('text'=>'this is a message from admin to someone', 'from'=>'1');

现在我需要查找/获取特定用户发送给特定用户的每条消息。 但在这个例子中只有'来自' ID存储在'消息中。直接表。

我甚至无法使用

访问任何消息的数据透视表
User::find(1)->sent_messages()->get();

在一个用户和另一个用户之间收集邮件的最佳做法是什么?

任何帮助高度赞赏

1 个答案:

答案 0 :(得分:2)

首先,我认为这是一个小错字:

public function sent_messages() {
  return $this->hasMany('Messages', 'from');
}

这应该是:

public function sent_messages() {
  return $this->hasMany('Message', 'from');
}

现在,如果您正在寻找从一个用户发送到另一个用户的所有消息,那么这个呢?未经测试,但对to关系施加约束应该可以解决问题。

$messages_from_A_to_B = Message::where('from', $UserA->id)->whereHas('to', function($q) use ($UserB) {
  $q->where('user_id', $UserB->id);
})->get();

在旁注中,我假设您明确要求用户可以向多个用户发送消息?另外,下表结构似乎更容易:

users: id
messages: from | to

然后你只需要:

class User extends Eloquent {

  public function messages() {
    return $this->hasMany('Message', 'to');
  }

  public function sent_messages() {
    return $this->hasMany('Message', 'from');
  }
}

class Message extends Eloquent {

  public function from() {
    return $this->belongsTo('User', 'from');
  }

  public function to() {
    return $this->belongsTo('User', 'to');
  }

}

$messages_from_A_to_B = Message::where('from', $UserA->id)->where('to', $UserB->id)->get();