Laravel中如何传递帖子ID至另一控制器获取对应数据表记录
解决订单提交时无法获取指定帖子ID的问题
这个问题的核心是你没有把当前帖子页面的ID传递到OrdersController的store方法中,而且用Post::all()获取的是所有帖子的集合,自然无法直接访问->id属性。下面分步骤给你解决:
1. 在帖子页面的表单中添加隐藏字段传递帖子ID
你的posts.show视图里,提交订单的表单需要携带当前帖子的ID。因为show方法已经把$post传递到视图了,所以直接在表单里加一个隐藏输入框:
<form action="{{ route('orders.store') }}" method="POST"> @csrf <!-- 不要忘记CSRF令牌 --> <!-- 你的其他订单字段,比如date_from输入框 --> <input type="date" name="date_from" required> <!-- 关键:添加隐藏字段传递帖子ID --> <input type="hidden" name="post_id" value="{{ $post->id }}"> <button type="submit">提交订单</button> </form>
2. 修改OrdersController的store方法获取指定帖子
现在请求里已经携带了post_id,你可以用这个ID精准找到对应的帖子,而不是获取所有帖子:
public function store(Request $request) { // 先添加验证规则,确保数据有效 $this->validate($request, [ 'post_id' => 'required|exists:posts,id', // 确保post_id在posts表中存在 'date_from' => 'required|date' // 根据你的业务需求调整验证规则 ]); // 通过请求中的post_id获取单个帖子模型 $post = Post::findOrFail($request->input('post_id')); $order = new Order; $order->client = Auth::user()->name; $order->phone = Auth::user()->phone; $order->vehicle = $post->id; // 现在$post是单个模型,能正常访问id属性了 $order->date_from = $request->input('date_from'); $order->save(); return redirect('/posts')->with('success', 'Rezervēts'); }
可选方案:通过路由参数传递帖子ID
如果你更倾向于用路由参数传递ID,可以这样做:
第一步:修改路由
在web.php中定义订单提交路由时,加入post_id参数:
Route::post('/orders/{post_id}', [OrdersController::class, 'store'])->name('orders.store');
第二步:修改表单的action
视图里的表单要把帖子ID作为路由参数传递:
<form action="{{ route('orders.store', ['post_id' => $post->id]) }}" method="POST"> @csrf <!-- 其他订单字段 --> <button type="submit">提交订单</button> </form>
第三步:修改store方法参数
直接从路由参数中获取post_id:
public function store(Request $request, $post_id) { $this->validate($request, [ 'date_from' => 'required|date' ]); $post = Post::findOrFail($post_id); // 后续订单保存逻辑和之前一致 }
额外提醒
- 确保用户已经登录:
Auth::user()如果为空,访问->name和->phone会报错,你可以在表单页面用@auth指令判断,或者在store方法里添加auth()->check()的判断。 - 用
findOrFail()替代find():如果传递的post_id无效,findOrFail()会直接返回404页面,避免后续代码报错。
内容的提问来源于stack exchange,提问作者krmd
相关产品推荐
相关产品推荐

