Laravel,主表中的一个数据透视表

时间:2018-06-02 16:19:17

标签: laravel eloquent laravel-5.5

我有两个与belongsToMany关系的表: message_topics 用户

数据透视表是 message_topics_users ,包含2列:message_id和user_id。

在表格 message_topics 中,我有一个名为 sender_id 的字段

我试图编写正确的雄辩语法来获取所有记录:

其中message_topics.sender_id = $ user_id   或者Message_topics_users.receiver_id = $ user_id

我尝试了很多东西,例如:

$topics = MessageTopic::where('sender_id', $user_id)
    ->wherePivot('receiver_id', $user_id)->orderBy('sent_at','desc')->get();

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用whereHas方法(或在本例中使用orWhereHas方法):

$topics = MessageTopic::where('sender_id', $user_id)
    ->orWhereHas('users', function ($query) use ($user_id) {
        $query->where('id', $user_id);
    })
    ->orderBy('sent_at', 'desc')
    ->get();

答案 1 :(得分:0)

我假设你有两个主题的关系?因为使用两个列和相同的关系太随意了......像这样

//On your MessageTopic model
public function sender(){
    return $this->belongsToMany('App\User', 'message_topics_users', 'message_id', 'sender_id');
}

public function receiver(){
    return $this->belongsToMany('App\User', 'message_topics_users', 'message_id', 'receiver_id'));
}

然后你可以使用whereHas和orWhereHas像这样:

//Again assuming you have your User model loaded as $user
$topics = App\Topic::whereHas('sender', function($q) use($user){
    $q->where('sender_id', '=', $user->id);
})
->orWhereHas('receiver', function($q) use($user){
   $q->where('receiver_id', '=', $user->id
})
->orderByDesc('sent_at')
->get();

whereHas和orWhereHas都查询模型(在本例中为MessageTopic),检查是否存在指定的关系(App\Topic::whereHas('sender')...)。它们还允许您传递您正在寻找的约束(function($q) use($user){ $q->... }

所以它基本上是说“只给我一个发送者或接收者的ID为$user->id的消息目录”