Laravel中Create方法内Set Mutator导致属性被移除的问题
解决Laravel News模型Create时Published_at属性被移除的问题
嘿,我看了你的News模型代码,问题出在setPublishedAtAttribute这个mutator的写法上!Laravel的setter mutator不是靠返回值来传递处理后的数据的,你现在用了return,导致框架根本没拿到你转换后的日期,自然在create的时候这个字段就被忽略了。
正确的Mutator写法
把你的mutator改成下面这样,直接给模型的$attributes数组赋值:
public function setPublishedAtAttribute($value) { $this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y H:i', $value)->toDateTimeString(); }
为什么原来的写法失效?
Laravel的mutator工作机制是:当你给模型属性赋值时,框架会触发对应的setter方法,但它不会接收方法的返回值,而是要求你在方法内部直接修改$this->attributes里的对应键值。你之前的return操作相当于啥也没给模型的属性赋值,所以执行create时,这个字段根本没被加入到要插入数据库的属性列表里,看起来就像是被"移除"了。
额外优化建议
- 异常处理:如果用户输入的日期格式不对,会直接抛出错误,你可以加个异常捕获,比如:
public function setPublishedAtAttribute($value) { try { $this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y H:i', $value); } catch (\InvalidArgumentException $e) { // 格式错误时的处理,比如设为当前时间或者抛出自定义验证错误 $this->attributes['published_at'] = now(); } }
- 利用$dates特性:你已经把
published_at加入了$dates数组,Laravel会自动把这个字段转换成Carbon实例,所以你其实不需要转成toDateTimeString(),直接赋值Carbon对象就行,后续获取这个属性时依然是Carbon实例,用起来更灵活。
内容的提问来源于stack exchange,提问作者Dorian Lecoeur
相关产品推荐
相关产品推荐

