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

Laravel 10中使用$guarded时为何_created_by字段未被包含?

Laravel 10 中 $guarded = [] 时 _created_by 字段无法批量赋值的问题解决

当设置 protected $guarded = []; 意图允许所有字段批量赋值,但唯独 _created_by 字段在 Model::create() 时未被赋值,而将其加入 $fillable 却能正常生效,可按以下步骤排查解决:

1. 确认请求数据是否包含目标字段

先确保传入 create() 方法的数组里确实存在 _created_by 字段,比如在调用前打印验证:

$data = $request->all();
dd($data); // 检查是否有 "_created_by" 键值

如果请求中没有这个字段,问题出在数据传递环节,和批量赋值规则无关。

2. 检查模型是否被自定义逻辑修改了批量赋值规则

有些模型可能重写了 getFillable()、getGuarded() 方法,或者引入了第三方 trait 改变了批量赋值的默认行为。比如:

// 错误示例:重写方法限制了字段
public function getFillable()
{
    return array_merge(parent::getFillable(), ['some_field']);
    // 若这里未包含 _created_by,即使 guarded=[] 也会被限制
}

检查模型代码,确保没有这类自定义逻辑覆盖默认规则。

3. 排查模型观察者或全局 Scope 的干扰

如果你的模型注册了观察者,检查 creating 事件中是否有覆盖或忽略 _created_by 的逻辑:

class YourModelObserver
{
    public function creating(YourModel $model)
    {
        // 错误示例:硬编码覆盖了字段值,导致传入的 _created_by 被替换
        $model->_created_by = auth()->id();
        // 正确做法:仅当字段未赋值时才设置默认值
        $model->_created_by = $model->_created_by ?? auth()->id();
    }
}

全局 Scope 也可能修改模型的赋值规则,检查是否有相关代码限制了 _created_by 的赋值。

4. 验证模型实际的批量赋值规则

在模型实例化后打印 getFillable() 和 getGuarded(),确认实际生效的规则:

$model = new YourModel();
dd($model->getFillable(), $model->getGuarded());

如果输出的 fillable 中没有 _created_by,说明有其他逻辑修改了规则,需要进一步排查来源。

5. 临时解决方案:显式加入 $fillable

如果以上排查都未找到问题,可尝试在模型中显式将 _created_by 加入 $fillable,即使已经设置 $guarded = []:

protected $fillable = ['_created_by', ...其他字段];
protected $guarded = [];

这种方式能强制让字段纳入批量赋值范围,适用于某些特殊场景下的规则冲突。

内容的提问来源于stack exchange,提问作者Blues Clues

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:50:15