返回

表单中 belongsToMany 关系预选复选框难题,如何解?

php

在表单中使用 belongsToMany 关系预检查复选框

问题:从 belongsTo 到 belongsToMany

使用“belongsTo”关系将每个游戏与一个类型关联时,选择类型并预检查列表中选择的功能非常方便。但是,切换到“belongsToMany”关系后,允许一行拥有多个关联,导致预检查复选框功能失效。

解决方案:使用 old() 预检查

解决此问题的方法是使用“old()”助手函数,它保留用户在表单提交后的输入。以下是如何使用“old()”预检查复选框:

  • 获取关联数据: 在控制器中获取所有类型并传递给视图。
  • 循环关联: 使用 Blade 循环遍历类型并生成复选框。
  • 使用 old() 预检查: 使用“old('genre', $game->genres->pluck('genre')->toArray())”检查每个复选框是否应该预先选中。
  • 设置复选框值: 将类型名称设置为复选框的值,以便在提交时可以访问该值。

示例代码

以下是示例代码,展示了如何实现预检查复选框:

控制器:

public function edit(Game $game)
{
    $this->authorize('update', $game);

    $genres = Genre::withCount('games')->get();

    return view('game.edit.index', compact('game', 'genres'));
}

视图:

@foreach($genres as $genre)
    <div class="flex items-start">
        <div class="flex items-center h-5">
            <input
                id="genre"
                name="genre[]"
                type="checkbox"
                class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
                value="{{ $genre->genre }}"
                {{ old('genre', $game->genres->pluck('genre')->toArray()) ? 'checked' : '' }}
            >
        </div>
        <div class="ml-3 text-sm">
            <p class="text-gray-500">{{ $genre->genre }} ({{ $genre->games_count }})</p>
        </div>
    </div>
@endforeach

结论

通过使用“old()”助手函数和预检查复选框,你可以轻松地处理“belongsToMany”关系中的表单输入。这将确保在表单提交后正确显示用户选择,从而简化用户体验。

常见问题解答

1. 为什么需要使用“old()”预检查复选框?

当表单提交并返回视图时,“old()”允许你保留用户之前的选择,包括复选框。

2. 如何使用“old()”预检查复选框?

使用“old('name', $value)”语法,其中“name”是复选框的名称,“value”是预选的值。

3. 什么是“belongsToMany”关系?

“belongsToMany”关系允许一个模型与多个其他模型关联。

4. 使用“belongsToMany”关系时,表单中复选框的目的是什么?

复选框允许用户选择多个关联。

5. 如何在使用“belongsToMany”关系时正确设置复选框的值?

将类型名称设置为复选框的值,以便在提交时可以访问该值。