Laravel 5.6如何获取当前认证用户所属的所有测验?
解决Laravel 5.6中获取当前认证用户所属测验的问题
看来你是因为没正确建立模型间的多对多关联,或者查询方式不对,才导致返回了所有测验。咱们一步步来搞定这个问题:
1. 先定义好模型的多对多关联
你的users和quizzes是多对多关系,中间表是user_quizzes,所以得在两个模型里把关联关系写清楚:
在User模型中添加关联
打开app/User.php,新增这个方法:
public function quizzes() { // 第二个参数是中间表名,第三、四个参数分别是当前模型和关联模型的外键 return $this->belongsToMany(Quiz::class, 'user_quizzes', 'user_id', 'quiz_id'); }
可选:在Quiz模型中添加反向关联
打开app/Quiz.php,可以加上反向关联(方便后续从测验维度查询关联用户):
public function users() { return $this->belongsToMany(User::class, 'user_quizzes', 'quiz_id', 'user_id'); }
2. 用正确的方式查询当前用户的测验
别再直接用Quiz::all()或者Quiz::get()了(这肯定会返回所有测验),要通过当前认证用户的关联关系来获取:
// 获取当前登录的用户 $currentUser = auth()->user(); // 获取该用户的所有测验 $userQuizzes = $currentUser->quizzes; // 如果需要加额外条件(比如排序、筛选),可以链式调用: $userQuizzes = $currentUser->quizzes() ->orderBy('created_at', 'desc') ->where('is_published', true) // 示例:只返回已发布的测验 ->get();
可能的排查要点
- 检查
user_quizzes表结构:确保user_id和quiz_id是正确的外键,分别关联users.id和quizzes.id - 确认关联方法里的中间表名和外键顺序:顺序搞反的话,关联会失效,要么返回空要么返回错误数据
- 验证当前用户在
user_quizzes表中是否有对应记录:如果没有,自然会返回空集合
内容的提问来源于stack exchange,提问作者Matt Kent
相关产品推荐
相关产品推荐

