Laravel:如何在store方法获取用户ID并发布评论?代码无法捕获会话用户ID
在Laravel的store方法中获取用户ID并关联评论的解决方案
我看了你这段代码,问题主要出在用户实例的获取方式和评论关联保存的逻辑上,咱们一步步来修正:
首先,你没必要单独通过User::find(\Auth::id())去查询用户——Laravel的Auth::user()已经直接返回了当前登录用户的实例,既省了一次数据库查询,也更可靠。
其次,你的代码里没有把评论和用户、地点做关联绑定,所以数据库里的外键(user_id和place_id)自然不会被填充。
修正后的完整代码
public function store(Request $request, $place_id) { // 1. 先验证请求数据,确保必填字段存在且合法 $validated = $request->validate([ 'review' => 'required|string', 'rating' => 'required|integer|min:1|max:5', // 可根据你的评分范围调整规则 ]); // 2. 确保用户已登录(如果路由没加auth中间件的话) if (!auth()->check()) { return redirect()->route('login')->with('error', '请先登录再发表评论'); } // 3. 获取当前登录用户实例 $user = auth()->user(); // 4. 查找对应的地点,找不到直接返回404 $place = Place::findOrFail($place_id); // 5. 创建评论并关联用户和地点(推荐使用关联关系创建) $review = $user->reviews()->create([ 'place_id' => $place->id, 'review' => $validated['review'], 'rating' => $validated['rating'], ]); // 也可以用直接设置外键的方式: // $review = new Review($validated); // $review->user_id = $user->id; // $review->place_id = $place->id; // $review->save(); // 6. 跳转回原页面并提示成功 return redirect()->back()->with('success', '评论发表成功!'); }
关键要点补充
- 路由中间件:记得给这个路由加上
auth中间件,这样未登录用户根本访问不到这个方法,省掉代码里的登录判断。比如在routes/web.php里:Route::post('/places/{place_id}/reviews', [ReviewController::class, 'store'])->middleware('auth'); - 模型关联定义:要确保你的三个模型都定义了正确的关联关系:
- 在
User.php中:public function reviews() { return $this->hasMany(Review::class); } - 在
Place.php中:public function reviews() { return $this->hasMany(Review::class); } - 在
Review.php中:public function user() { return $this->belongsTo(User::class); } public function place() { return $this->belongsTo(Place::class); }
- 在
findOrFail的优势:相比find,如果找不到对应的地点,findOrFail会直接返回404响应,不用手动处理不存在的情况。
这样修改后,评论就能正确关联到当前登录用户和对应的地点,数据库里的user_id和place_id外键也会被正确填充啦。
内容的提问来源于stack exchange,提问作者Z.Cale
相关产品推荐
相关产品推荐

