Laravel如何获取已认证用户投票过的问题列表(仅返回问题)
解决方案:获取已认证用户投票过的纯问题列表
当然可行!Laravel的Eloquent ORM提供了多种简洁的方式来实现这个需求,下面我给你两种常用的方案,你可以根据自己的代码结构选择:
方案一:使用hasThrough关联(推荐,更高效)
这种方式通过一次数据库查询直接获取用户投票过的问题,避免额外的集合操作。
1. 完善User模型的关联
在User模型中定义一个关联方法,通过Vote模型间接关联到Question:
// app/Models/User.php public function votedQuestions() { return $this->hasThrough( Question::class, Vote::class, 'user_id', // Votes表中关联User的外键 'id', // Questions表的主键 'id', // Users表的主键 'question_id' // Votes表中关联Question的外键 ); }
2. 在控制器中查询并返回结果
直接通过认证用户的关联方法获取问题,并用select确保只返回问题表的字段:
// 控制器方法 public function getVotedQuestions() { $votedQuestions = auth()->user()->votedQuestions() ->select('questions.*') // 明确只取Questions表的所有字段 ->get(); return response()->json($votedQuestions); }
方案二:通过Vote模型关联查询(适合已有Vote关联的场景)
如果你的代码中已经用到了User和Vote的关联,也可以通过Vote模型反向关联到Question,再提取问题数据:
1. 确保Vote模型的关联正确
确认Vote模型中已经定义了与Question的关联:
// app/Models/Vote.php public function question() { return $this->belongsTo(Question::class); }
2. 控制器中查询并提取问题
先查询当前用户的所有投票,预加载关联的Question,再通过集合操作提取并去重问题:
// 控制器方法 public function getVotedQuestions() { $votedQuestions = Vote::where('user_id', auth()->id()) ->with('question') // 预加载Question,避免N+1查询 ->get() ->pluck('question') // 提取所有关联的Question对象 ->unique('id'); // 去重,防止同一问题被多次投票的情况 return response()->json($votedQuestions); }
关键说明
- 两种方案都能确保返回的JSON仅包含Question表的原始数据,不会携带Vote相关的字段。
- 方案一的
hasThrough是单次数据库查询,性能更优;方案二更灵活,适合需要对Vote数据做额外处理的场景。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

