我正在创建一个基本的消息传递系统,需要查询透视表上的数据。相关表格设置如下:
| conversations | messages | message_user | conversation_user |
------------------------------------------------------------------------------
| id | id | message_id | conversation_id |
| created_at | conversation_id | user_id | user_id |
| updated_at | content | sender | |
| deleted_on | created_at | unread | |
| | updated_at | deleted | |
------------------------------------------------------------------------------
简单地说,每个对话都有用户,每个用户都有消息,每个消息都在一个对话中。message_user
表是一个透视表,converston_user表也是如此。
我的模型是这样设置的:
class Message extends Eloquent {
public $touches = ['conversation'];
public function conversation() {
return $this->hasOne('Conversation');
}
public function user() {
return $this->belongsToMany('User')->withPivot(['sender', 'unread', 'deleted']);
}
public function session() {
return $this->hasOne('UserSession');
}
}
class Conversation extends Eloquent {
public function users() {
return $this->belongsToMany('User');
}
public function product() {
return $this->hasOne('Product');
}
public function messages() {
return $this->hasMany('Message');
}
}
class User extends Eloquent {
...
public function conversations() {
return $this->belongsToMany('Conversation');
}
public function messages() {
return $this->belongsToMany('Message');
}
...
}
当一条消息被保存时,它会为参与对话的每个用户更新一个字段:
foreach($conversation->users as $user) {
$message->users()->attach($user->id [
'sender' => (Auth::user()->id === $user->id),
'unread' => (Auth::user()->id !== $user->id),
'deleted' => false,
]);
}
为了获得所有用户的对话,我做了以下操作:
$user = Auth::user();
foreach($user->conversations as $conversation) {
// get each message from the conversation
foreach($conversation->messages as $message) {
}
}
我的问题是,在决定是否向用户显示消息之前,我需要查询透视表以了解用户是否删除了消息,因为删除是针对每个用户的。
我可以在我的对话模型中做这样的事情:
public function notDeletedMessage() {
return $this->messages()
->join('message_user', 'message_user.message_id', '=', 'messages.id')
->where('message_user.user_id', Auth::user()->id)
->where('message_user.deleted', false);
}
但这似乎有点棘手,有更好的方法来实现这一功能吗?
您是否尝试过在集合中使用pivot?http://four.laravel.com/docs/eloquent#working-带有数据透视表