Laravel中Createoffice与Editoffice表单返回按钮路由调用问题
你遇到的Undefined variable: building错误,核心原因是在Createoffice和Editoffice视图中,你并没有传递$building变量到视图里,但模板里却尝试调用$building->id,自然会触发报错。咱们一步步来修复:
1. 修复Createoffice表单的返回按钮
先看你的OfficeController@create方法:
public function create($id) { return view('createoffice')->with('id', $id); }
这里只传了办公楼的$id,没有传递完整的$building实例,所以有两种修复思路:
方式一:直接用已传递的$id生成路由
把视图里的返回按钮代码改成:
<a href="{{ route('building', $id) }}" class="btn btn-default">Back</a>
既然已经拿到了办公楼的id,直接用这个值就能生成正确的跳转路由,不用依赖$building变量。
方式二:传递完整的$building实例到视图
修改OfficeController@create方法,先查询出办公楼实例再传递:
public function create($id) { $building = Building::find($id); return view('createoffice')->with('building', $building); }
这样视图里原来的{{ route('building', $building->id) }}就能正常工作了。
2. 修复Editoffice表单的返回按钮
再看OfficeController@edit方法:
public function edit($id) { $office = Office::find($id); return view('editoffice')->withOffice($office)->with('id',$id); }
这里的$id是办公室的id,不是办公楼的id,直接用会跳错页面。我们可以通过关联关系获取办公楼信息:
方式一:通过办公室模型获取办公楼id
把视图里的返回按钮改成:
<a href="{{ route('building', $office->building_id) }}" class="btn btn-default">Back</a>
因为$office已经传到视图里了,它自带的building_id字段就是我们需要的办公楼id。
方式二:传递$building实例到视图
先确保Office模型里定义了和Building的关联(比如public function building() { return $this->belongsTo(Building::class); }),然后修改edit方法:
public function edit($id) { $office = Office::find($id); $building = $office->building; return view('editoffice')->with('office', $office)->with('building', $building); }
之后视图里原来的{{ route('building', $building->id) }}就可以正常使用了。
额外优化建议
- 给
building/{id}路由加上名称,让路由调用更规范:
Route::get('building/{id}', 'PageController@show')->name('building');
- 调整
store和update方法里的代码顺序,Session::flash()要放在return之前才会生效,同时建议直接跳转到目标页面而非返回上一页:
public function store(Request $request, $id) { $office = new Office(); $office->name = $request->officename; $office->floor = $request->floor; $office->building_id = $id; $office->save(); \Session::flash('building_flash', 'Created successfully!'); return redirect()->route('building', $id); // 直接跳转到办公楼列表页 }
内容的提问来源于stack exchange,提问作者TeamPlar Jarj

