Laravel使用Mutator向数据库写入预设company_id不生效如何解决
问题原因
你写的修改器(Mutator)方法名为setFirstNameAttribute,Laravel的修改器触发规则是:只有对模型对应属性赋值时才会自动调用,也就是只有你修改first_name字段的时候这个方法才会执行。你创建产品时如果没有操作first_name字段,这个方法自然不会触发,也就不会给company_id赋值,最终存储值为null。
推荐解决方案
方案1:使用模型creating事件(最优,无侵入、易复用)
Laravel模型的creating事件会在每次执行插入数据操作前自动触发,不需要依赖任何特定字段的赋值,非常适合自动填充默认字段的场景。
你只需要在Product模型中添加如下代码即可:
protected static function boot(): void { parent::boot(); // 新建产品前自动填充企业ID static::creating(function (Product $product) { $product->company_id = session()->get('company.id'); }); }
方案2:创建时手动统一赋值
如果你只有少数地方会写创建产品的逻辑,也可以直接在控制器的新增逻辑里手动合并company_id参数:
// 示例:表单验证通过后合并参数写入 Product::create($request->validated() + [ 'company_id' => session()->get('company.id') ]);
注意事项
- 请先确认
company_id已经被添加到Product模型的$fillable属性中,否则会被Laravel的批量赋值过滤机制拦截 - 可以先手动打印
session()->get('company.id')确认session中确实存在该值,避免本身session数据为空导致的存储null问题 - 如果涉及在队列、命令行等无session的场景下创建产品,需要额外补充
company_id的赋值逻辑,避免数据异常
内容的提问来源于stack exchange,提问作者jcobo1
相关产品推荐
相关产品推荐

