编辑表单技术问题:如何区分初始加载与空旧值状态
解决Laravel表单input值保留空字符串的问题
问题根源是你用了松散相等== null,在PHP中空字符串""和null进行松散比较时会被判定为相等,导致提交空字符串时,逻辑又回到了$prod的初始值。
解决方案
利用Laravel old()函数的默认参数特性,直接简化value的逻辑:
<input type="number" class="form-control @error('prodCost') is-invalid @enderror" name="prodCost" id="prodCost" max="10000000" min="0" value="{{ old('prodCost', isset($prod) ? $prod->getCost()->getValue() : '') }}" >
逻辑说明
old('prodCost', 默认值)的行为是:如果session中存在prodCost的提交值(包括空字符串),就返回该值;如果不存在(初始加载状态),则使用后面的默认值。- 初始加载时:
- 编辑场景:
isset($prod)为true,默认值是$prod->getCost()->getValue(),显示初始值 - 新增场景:
isset($prod)为false,默认值是空字符串,输入框为空
- 编辑场景:
- 提交空字符串或无效值后:
old('prodCost')会返回提交的空字符串,输入框保持为空,同时配合@error显示错误提示
另一种写法(用严格相等判断)
如果不想用old的默认参数,也可以把松散相等改成严格相等===,明确只在old('prodCost')严格为null时才使用初始值:
value="{{ old('prodCost') !== null ? old('prodCost') : (isset($prod) ? $prod->getCost()->getValue() : '') }}"
这两种写法都能解决空字符串被当成null的问题,优先推荐第一种,更符合Laravel的惯用写法。
内容的提问来源于stack exchange,提问作者HockChai Lim
相关产品推荐
相关产品推荐

