Eloquent关联批量赋值时$guarded失效问题求助
问题原因与解决方案
当你通过Admin模型的关联调用update()方法时,如果使用的是关联查询实例的update(即$admin->vendorBusinessDetails()->update($data)这种带括号的写法),Laravel会直接执行SQL更新语句,不会经过VendorBusinessDetails模型的批量赋值验证(也就是忽略$guarded和$fillable规则),这就是shop_name字段被修改的核心原因。
解决办法
1. 改用模型实例的update方法
先获取关联的模型实例,再调用update(),此时会严格遵守模型的$guarded规则:
// 获取关联模型实例 $businessDetails = $admin->vendorBusinessDetails; // 传入更新数据,模型自动过滤guarded字段 $businessDetails->update($request->all());
2. 手动过滤禁止更新的字段
如果坚持使用关联查询的update方法,需要手动排除shop_name字段:
$admin->vendorBusinessDetails()->update($request->except('shop_name'));
3. 改用$fillable明确控制可赋值字段
相比$guarded,使用$fillable指定允许批量赋值的字段会更清晰,避免规则遗漏:
// 在VendorBusinessDetails模型中 protected $fillable = ['允许更新的字段1', '允许更新的字段2']; // 不包含shop_name
额外检查点
- 确认代码中没有使用
forceFill()方法,该方法会强制忽略$guarded规则 - 检查是否有其他逻辑(比如模型观察者、全局作用域)修改了模型的批量赋值规则
内容的提问来源于stack exchange,提问作者Orkhan Orkhan
相关产品推荐
相关产品推荐

