You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:09:12