在Eloquent中查询数据透视属性


Querying pivot attributes in Eloquent

我正在创建一个基本的消息传递系统,需要查询透视表上的数据。相关表格设置如下:

|  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-带有数据透视表