Laravel 7编辑表单分类下拉框旧值无法选中问题求助
解决Laravel 7编辑表单分类下拉框无法选中旧值的问题
我帮你排查出几个核心问题,一步步修正就能搞定:
1. 变量名冲突直接搞乱了判断逻辑
你在视图里循环分类时,用了和当前编辑的分类完全一样的变量名$category——这会把你要编辑的原始分类模型给直接覆盖掉!循环里的$category->parent其实是当前循环项的父ID,根本不是你要编辑的那个分类的父ID,这直接导致选中判断完全偏离预期。
修正方法:把循环变量改成别的名字,比如$cat:
<option value="0"{{ $category->parent == 0 ? 'selected': '' }}>دسته اصلی</option> @foreach(\App\Category::all() as $cat) <option value="{{ $cat->id }}" {{ 这里放正确的选中判断 }}> @if($cat->parent == 0) {{ $cat->name }} @else -- {{ $cat->name }} @endif </option> @endforeach
2. 选中判断的逻辑完全错误
你原来的两个判断都没踩对点子:
- 第一个
old('parent') ? 'selected' : '':old('parent')只是返回上次提交的值,但你没把它和当前option的value对比,不管值是什么都会触发选中,完全不合理。 - 第二个
in_array($category->id ,$category->child()->pluck('id')->toArray()):逻辑完全跑偏了,这是在判断当前循环的分类是不是自己的子分类,和你要编辑的分类的父ID没有半毛钱关系。
正确的选中判断写法:
Laravel的old()函数可以传第二个参数作为默认值(也就是编辑的分类的父ID),我们只需要对比当前option的value是否等于old('parent', $category->parent)就行:
<option value="{{ $cat->id }}" {{ old('parent', $category->parent) == $cat->id ? 'selected' : '' }}>
3. 可选优化建议
- 别在视图里直接写
\App\Category::all(),建议在控制器里提前查好分类数据传过来,更符合MVC规范:
然后视图里用// 控制器的编辑方法 public function edit(Category $category) { $categories = Category::all(); return view('categories.edit', compact('category', 'categories')); }@foreach($categories as $cat)循环即可。 - 如果你的分类是树形层级结构,可以用递归方式自动生成层级前缀(比如多级
--),避免手动判断,不过这属于额外优化,不影响当前问题的解决。
最终修正后的完整视图代码
<option value="0"{{ old('parent', $category->parent) == 0 ? 'selected': '' }}>دسته اصلی</option> @foreach($categories as $cat) <option value="{{ $cat->id }}" {{ old('parent', $category->parent) == $cat->id ? 'selected' : '' }}> @if($cat->parent == 0) {{ $cat->name }} @else -- {{ $cat->name }} @endif </option> @endforeach
这样修改后,编辑页面会默认选中当前分类的父分类,要是表单验证失败,也会保留用户上次选择的值,完全符合需求。
内容的提问来源于stack exchange,提问作者tohid
相关产品推荐
相关产品推荐

