Laravel中create与edit共享表单时如何统一$hotel变量引用
问题原因
两个场景下变量引用方式不一致的核心原因有两点:
- edit方法查询单条数据时误用了
get()方法:get()无论匹配多少条结果,都会返回模型集合(结构类似数组),哪怕按主键ID查询仅匹配1条结果,数据也会被包裹在集合的第0位,才会出现需要用$hotel[0]取值的情况。 - create方法没有向视图传递
$hotel变量,会导致共用视图在创建场景下直接报变量未定义错误。
调整方案
只需要修改两个控制器方法,保证两个场景传递给视图的$hotel都是Hotel模型实例即可,不需要改动视图的核心调用逻辑。
1. 调整edit控制器方法
单条数据查询不要用get(),替换为find()(按主键查询)或者first()(取第一条结果),直接返回单条模型实例:
public function edit($id) { // 直接查询单条模型实例,预加载酒店设施关联 $hotel = Hotel::with('hotelFacilities')->find($id); // 可选:查询不到对应数据时返回404 if (!$hotel) { abort(404); } return view('hotels.edit', compact('hotel')); }
如果你用了Laravel的路由模型绑定,代码可以更简洁,不需要手动写查询逻辑:
// 对应路由定义示例:Route::get('hotels/{hotel}/edit', [HotelController::class, 'edit']) public function edit(Hotel $hotel) { // 框架会自动按主键查询对应模型,不存在时自动返回404 $hotel->load('hotelFacilities'); // 单独预加载关联数据 return view('hotels.edit', compact('hotel')); }
2. 调整create控制器方法
给视图传递一个空的Hotel模型实例,保证和编辑场景的变量结构完全一致,不会出现变量未定义问题:
public function create() { $hotel = new Hotel(); return view('hotels.create', compact('hotel')); }
3. 视图适配注意点
创建场景下$hotel是空模型实例,没有关联的酒店设施数据,取值时建议配合空合并运算符避免报错,同时结合old()辅助函数实现表单验证失败时的输入回显:
{{-- 普通字段取值示例 --}} <input type="text" name="hotel_name" value="{{ old('hotel_name', $hotel->name ?? '') }}"> {{-- 关联设施字段取值示例 --}} <input type="checkbox" name="fitness_centre" value="1" {{ old('fitness_centre', $hotel->hotelFacilities->fitness_centre ?? 0) ? 'checked' : '' }}>
调整完成后,创建、编辑两个场景下都可以直接用$hotel->xxx、$hotel->hotelFacilities->xxx的方式取值,完全适配共用表单的逻辑。
内容的提问来源于stack exchange,提问作者ottz0
相关产品推荐
相关产品推荐

