我遇到了问题,在这种情况下尝试使用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();
通过此查询,我获得了主题1
和2
。这是一个错误的结果。这必须只有主题2
。
然后我试试这个。
$subject = Subject::whereHas('User', function ($query) use ($request) {
$query->where('user_id', Auth::id())->where('user_id', $request->user_id);
})->get();
它不会得到任何科目。
在这种情况下,我使用什么查询才能获得主题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
或者无效,则需要更改输入的顺序。