Laravel:表单字段与Eloquent模型异名能否在模型内映射?
当然可以在模型层面搞定这个字段映射,不用在控制器里手动折腾!给你两个Laravel原生的优雅方案:
方法一:重写模型的fill方法
这个方法专门针对批量赋值场景(比如create、fill),会自动把表单的subject字段映射到模型的subject_id字段:
class Message extends Model { protected $fillable = [ 'name', 'email', 'subject_id', ]; public function fill(array $attributes) { // 检查数组里有没有subject字段,有的话转成subject_id再移除原字段 if (array_key_exists('subject', $attributes)) { $attributes['subject_id'] = $attributes['subject']; unset($attributes['subject']); } return parent::fill($attributes); } }
改完之后你原来的控制器代码完全不用动——调用Message::create($message)时,模型会自动把请求里的subject键替换成subject_id,完美适配数据库字段。
方法二:使用属性修改器(Mutator)
要是你希望不仅批量赋值时生效,手动给模型赋值$message->subject = xxx时也能自动映射,就用Laravel的属性修改器。不过要记得把subject加到$fillable里,让批量赋值允许这个字段:
class Message extends Model { protected $fillable = [ 'name', 'email', 'subject_id', 'subject', // 把subject加入可填充列表 ]; // 定义subject属性的修改器,赋值时自动同步到subject_id public function setSubjectAttribute($value) { $this->attributes['subject_id'] = $value; } }
这个方法更灵活,不管是批量赋值还是单独给subject属性传值,都会自动把值存到subject_id字段里。唯一的小细节是$fillable里多了一个数据库不存在的字段,但这在Laravel里完全没问题,不会有任何副作用。
选哪个?
- 要是只需要处理表单提交的批量赋值场景,方法一更简洁,不用改
$fillable; - 要是需要支持手动赋值
subject的场景,方法二更实用。
内容的提问来源于stack exchange,提问作者woopata
相关产品推荐
相关产品推荐

