如何使用belongsToMany关系

时间:2017-11-13 05:08:59

标签: laravel eloquent laravel-eloquent laravel-5.5

我遇到了问题,在这种情况下尝试使用whereHas

users

----------------
| id | name    |
----------------
| 1  | AAA     |
| 2  | BBB     |
| 3  | CCC     |
----------------

subjects

------------------
| id | title     |
------------------
| 1  | Subject 1 |
| 2  | Subject 2 |
------------------

subject_user

------------------------
| user_id | subject_id |
------------------------
| 1       | 1          |
| 2       | 1          |
| 1       | 2          |
| 3       | 2          |
------------------------
主题模型中的

...

public function User()
{
    return $this->belongsToMany(User::class, 'subject_user');
}

...

当我想通过此查询找到user_id的主题时。

在这种情况下Auth::id() == 1$request->user_id == 3

$subject = Subject::whereHas('User', function ($query) use ($request) {
    $query->whereIn('user_id', [Auth::id(), $request->user_id]);
})->get();

通过此查询,我获得了主题12。这是一个错误的结果。这必须只有主题2

然后我试试这个。

$subject = Subject::whereHas('User', function ($query) use ($request) {
    $query->where('user_id', Auth::id())->where('user_id', $request->user_id);
})->get();

它不会得到任何科目。

在这种情况下,我使用什么查询才能获得主题2

2 个答案:

答案 0 :(得分:1)

@Lloople从你的回答中,我有了一个主意。

$subject = Auth::user()->Subject()->whereHas('User', function ($query) use ($request) {
    $query->where('user_id', $request->id);
})->first();

答案 1 :(得分:0)

为什么不倒退呢?您已经拥有登录用户,因此如果您在User模型中定义关系,则可以执行

$subjects = auth()->user()->subjects;

无论如何,您无需检查Auth::id()$request->user_id的两倍。事实上,我不确定你能不能做到最后一次。

评论后编辑

$subjects = Subject::whereBetween(auth()->user()->id, $request->user_id)->get();

如果$request->user_id小于auth()->user()->id或者无效,则需要更改输入的顺序。