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

Laravel项目:更新住户信息时下拉框无法回显旧值问题

问题:住户信息编辑页下拉框无法回显旧值

更新住户信息时,下拉框无法显示原有选中值,视图回显失败。以下是相关代码及修复方案:


相关代码

编辑控制器(edit controller)

public function edit(string $id)
{
    $household = HouseholdHead::find($id);
    $puroks = Purok::all();
    $env_hazards = EnvHazard::all();
    $categories = SDOHCategory::all();

    $sdoh_one = SDOH::where('sdoh', 'SDOH 1')->first()->sdoh_category;
    $sdoh_two = SDOH::where('sdoh', 'SDOH 2')->first()->sdoh_category;
    $sdoh_three = SDOH::where('sdoh', 'SDOH 3')->first()->sdoh_category;
    $sdoh_four = SDOH::where('sdoh', 'SDOH 4')->first()->sdoh_category;

    return view('household_edit', compact('puroks', 'categories', 'env_hazards', 'sdoh_one', 'sdoh_two','sdoh_three', 'sdoh_four', 'household'));
}

更新控制器(update controller)

public function update(Request $request, string $id)
{
    $household = HouseholdHead::find($id);

    $household->name = $request->name;
    $household->purok_id = $request->purok;
    $household->env_hazard_id = $request->hazards;
    $household->number_of_adults = $request->adults;
    $household->save();

    $categories = [ 'sdoh_One', 'sdoh_Two', 'sdoh_Three', 'sdoh_Four' ];

    foreach ($categories as $category) {
        $sdohCategory = new SDOHCategoryHousehold();
        $sdohCategory->household_head_id = $household->id;
        $sdohCategory->sdoh_category_id = $request->get($category);
        $sdohCategory->save();
    }

    return redirect()->route('admin.household.index')->with('success', 'Household Head Updated Successfully!');
}

视图(views)代码

<div class="form-floating mb-3">
    <select class="form-control" name="sdoh_One" id="sdoh_One" required>
        <option value="0" disabled="true" selected="true">Select SDOH 1</option>

        @foreach($sdoh_one as $sdoh_ones)
            <option value="{{ $sdoh_ones->id}}" @if($sdoh_ones->sdoh_One  == $sdoh_ones->id) selected @endif>{{ $sdoh_ones->category }}</option>
        @endforeach

    </select>
    <label for="floatingSelect"> SDOH 1</label>
</div>

问题原因

  • 选中判断逻辑完全错误:视图中的@if($sdoh_ones->sdoh_One == $sdoh_ones->id)是拿当前循环的分类ID和自身比较,永远为真,导致所有选项都被标记为选中(浏览器仅保留最后一个),且未关联当前住户的已选值。
  • 未传递住户已选数据:编辑控制器仅传入了SDOH的可选分类列表,没有获取当前住户已选中的SDOH分类ID,无法做回显对比。
  • 更新逻辑冗余:每次更新都创建新的SDOHCategoryHousehold记录,未删除旧关联数据,导致数据混乱,影响后续回显。

修复方案

1. 修改编辑控制器,获取住户关联的SDOH分类

public function edit(string $id)
{
    $household = HouseholdHead::find($id);
    $puroks = Purok::all();
    $env_hazards = EnvHazard::all();
    $categories = SDOHCategory::all();

    // 获取SDOH分类选项
    $sdoh_one = SDOH::where('sdoh', 'SDOH 1')->first()->sdoh_category;
    $sdoh_two = SDOH::where('sdoh', 'SDOH 2')->first()->sdoh_category;
    $sdoh_three = SDOH::where('sdoh', 'SDOH 3')->first()->sdoh_category;
    $sdoh_four = SDOH::where('sdoh', 'SDOH 4')->first()->sdoh_category;

    // 获取当前住户已选的SDOH分类ID,按类型分组
    $selectedSdoh = SDOHCategoryHousehold::where('household_head_id', $id)
        ->get()
        ->keyBy(function ($item) {
            // 根据数据结构映射SDOH类型到对应字段
            $sdoh = SDOH::whereHas('sdoh_category', function ($q) use ($item) {
                $q->where('id', $item->sdoh_category_id);
            })->first();
            return match($sdoh->sdoh) {
                'SDOH 1' => 'sdoh_One',
                'SDOH 2' => 'sdoh_Two',
                'SDOH 3' => 'sdoh_Three',
                'SDOH 4' => 'sdoh_Four',
            };
        })
        ->map(function ($item) {
            return $item->sdoh_category_id;
        });

    return view('household_edit', compact('puroks', 'categories', 'env_hazards', 'sdoh_one', 'sdoh_two','sdoh_three', 'sdoh_four', 'household', 'selectedSdoh'));
}

2. 修复视图的选中判断逻辑

<div class="form-floating mb-3">
    <select class="form-control" name="sdoh_One" id="sdoh_One" required>
        <option value="0" disabled>选择SDOH 1</option>

        @foreach($sdoh_one as $sdoh_ones)
            <option value="{{ $sdoh_ones->id}}" @if(isset($selectedSdoh['sdoh_One']) && $selectedSdoh['sdoh_One'] == $sdoh_ones->id) selected @endif>{{ $sdoh_ones->category }}</option>
        @endforeach

    </select>
    <label for="floatingSelect"> SDOH 1</label>
</div>

注意:移除默认的selected="true",否则会覆盖自定义选中判断,浏览器会优先选择带有selected属性的选项。

3. 修复更新控制器的冗余数据问题

public function update(Request $request, string $id)
{
    $household = HouseholdHead::find($id);

    $household->name = $request->name;
    $household->purok_id = $request->purok;
    $household->env_hazard_id = $request->hazards;
    $household->number_of_adults = $request->adults;
    $household->save();

    // 先删除该住户旧的SDOH关联数据
    SDOHCategoryHousehold::where('household_head_id', $id)->delete();

    $categories = [ 'sdoh_One', 'sdoh_Two', 'sdoh_Three', 'sdoh_Four' ];

    foreach ($categories as $category) {
        $sdohCategoryId = $request->get($category);
        if ($sdohCategoryId && $sdohCategoryId != 0) { // 跳过未选择的情况
            $sdohCategory = new SDOHCategoryHousehold();
            $sdohCategory->household_head_id = $household->id;
            $sdohCategory->sdoh_category_id = $sdohCategoryId;
            $sdohCategory->save();
        }
    }

    return redirect()->route('admin.household.index')->with('success', '住户信息更新成功!');
}

内容的提问来源于stack exchange,提问作者Big Brother

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:24:52