Laravel中无ID参数方法重定向至带ID参数控制器页面问题
解决重定向到带ID参数的控制器页面问题
咱们先拆解下你遇到的核心问题:你的getComment方法想重定向到需要ID的comment页面,但目前有两个关键问题——一是getComment的路由没传递ID参数,导致方法里的$id根本拿不到有效值;二是重定向的写法不符合Laravel的规范。下面一步步来解决:
1. 先获取正确的ID值
你的POST路由ifa-dashboard/getComment没有定义{id}参数,所以控制器方法里的$id参数是无效的。得换个方式拿到目标ID:
- 如果提交的表单里有隐藏字段(比如
complaint_id),直接从请求中获取:$id = $request->input('complaint_id'); - 如果只有
ticket_no,就通过它去数据库查询对应的投诉ID:$complaint = Complaint::where('ticket_no', $request->input('ticket_no'))->first(); $id = $complaint->id;
2. 使用Laravel推荐的重定向方式
Laravel里推荐用路由名称生成带参数的URL,你的comment路由已经命名为ifa.comment,这种方式既灵活又不容易出错:
修正后的getComment方法
public function getComment(Request $request) { $complain_id = $request->input('ticket_no'); $user_name = $request->input('user_name'); $comment = $request->input('comment'); // 别忘了先保存评论!你之前的代码缺少这一步,评论无法存入数据库 \DB::insert('INSERT INTO comments (comment, comment_by, complaint_id) VALUES (?, ?, ?)', [$comment, $user_name, $complain_id]); // 通过ticket_no获取对应的投诉ID $complaint = Complaint::where('ticket_no', $complain_id)->first(); $id = $complaint->id; // 用路由名称重定向,并传入ID参数 return redirect()->route('ifa.comment', ['id' => $id]); }
3. 修正路由与控制器的参数匹配
你的POST路由getComment不需要{id}参数,所以控制器方法里要去掉$id参数,否则Laravel会因参数不匹配报错。路由保持原样即可:
Route::POST('ifa-dashboard/getComment','ComplainController@getComment');
额外的优化建议
- 尽量避免直接写原生SQL,用Eloquent ORM更简洁安全,比如查询评论可以改成:
$comment = Comment::whereIn('comment_by', ['Admin', $user_name]) ->where('complaint_id', $tik) ->orderBy('id', 'desc') ->limit(2) ->get(); - 你的
comment方法里用get()加foreach的写法有问题:get()返回的是集合,如果你只需要单条数据,用first()更合适,否则foreach里的return会直接返回第一条数据,后续循环根本不会执行:$ticket = Complaint::where('id', $id)->select('ticket_no')->first(); if ($ticket) { $tik = $ticket->ticket_no; // 上面的ORM查询评论逻辑 return view('work.comment', compact('ticket', 'id', 'comment', 'user_name')); } // 处理找不到投诉的情况,给用户友好提示 return redirect()->back()->with('error', '对应的投诉不存在');
内容的提问来源于stack exchange,提问作者SWARNADEEP PRAMANICK
相关产品推荐
相关产品推荐

