Laravel:从URL取ID并在CRUD控制器中为老客户添加订单
解决从客户页面跳转到订单创建页并获取客户ID的问题
看起来你遇到的核心问题是路由参数与URL生成不匹配,导致控制器无法正确获取客户ID。咱们一步步来搞定:
第一步:修正路由与URL生成的匹配
你当前的URL是/orders/create?2f10f8a0-30b9-11e8-8711-dd477b141226,这说明ID被当成了查询参数(问号后的内容),但你的路由定义的是路由参数{id},所以得先让action生成符合路由规则的URL格式。
调整路由定义
建议把参数名改得更清晰(比如customer_id),避免歧义:
Route::get('orders/create/{customer_id}', 'OrderController@create');
修正视图中的action链接
在customers.show视图里,要明确指定参数的键名,这样Laravel才能生成正确的路由参数格式,而不是查询参数:
<a href="{{ action('OrderController@create', ['customer_id' => $customer['id']]) }}">创建订单</a>
这样生成的URL就会变成/orders/create/2f10f8a0-30b9-11e8-8711-dd477b141226,完全匹配路由的参数定义。
第二步:在OrderController中获取客户ID
现在路由参数正确了,你可以直接在create方法中通过参数接收:
public function create($customer_id) { // 可以用ID获取客户信息,方便后续关联 $customer = Customer::findOrFail($customer_id); // 把客户数据传递到订单创建视图 return view('orders.create', compact('customer')); }
如果你的控制器是资源控制器,注意资源控制器的create方法默认没有参数,所以要把这个自定义路由放在资源路由之前,避免被覆盖:
// 先定义带客户ID的创建路由 Route::get('orders/create/{customer_id}', 'OrderController@create'); // 再定义资源路由 Route::resource('orders', 'OrderController');
第三步:在CRUD操作中使用客户ID
创建订单时关联客户
在订单表单提交的store方法中,把客户ID赋值给订单的关联字段(比如customer_id):
public function store(Request $request) { // 验证订单字段 $validated = $request->validate([ 'order_number' => 'required', // ...其他订单字段规则 ]); // 建议在订单创建视图中添加隐藏字段传递客户ID: // <input type="hidden" name="customer_id" value="{{ $customer->id }}"> $validated['customer_id'] = $request->input('customer_id'); // 创建订单 Order::create($validated); return redirect()->route('customers.show', $request->input('customer_id'))->with('success', '订单创建成功'); }
其他CRUD操作关联
比如查看订单详情、编辑订单时,都可以通过订单模型的关联关系获取客户信息,或者直接传递客户ID进行相关操作。
为什么之前拿不到ID?
因为你的URL是/orders/create?xxx格式,这种情况下ID是查询参数,需要用$request->query('xxx')获取,但这不符合你想要的路由参数方式,所以修正URL生成格式是解决问题的关键。
内容的提问来源于stack exchange,提问作者Dexx
相关产品推荐
相关产品推荐

