基于现有模型数据创建内存模型:Event模型缺失id问题
解决Laravel模型内存构建时缺失ID字段的问题
现有模型结构
{ "id": 1, "event": { "id": 2, "source": "browser-sdk" } }
期望转换后的结构
{ "id": 2, "source": "browser-sdk", "eventable": { "id": 1 } }
用户尝试的代码
$event = new Event([ 'id' => $existingModel->event->id, 'source' => $existingModel->event->source, ]); $event->setRelation('eventable', $existingModel); dd($event);
问题原因
Laravel模型构造函数传参属于批量赋值,默认受模型的$fillable(允许填充字段)或$guarded(禁止填充字段)规则限制。如果Event模型未将id加入$fillable,或者默认的$guarded包含id,构造函数传入的id会被过滤,最终导致对象缺失ID字段。
解决方法
方法1:手动逐个设置属性
绕过批量赋值限制,直接给模型属性赋值:
$event = new Event(); $event->id = $existingModel->event->id; $event->source = $existingModel->event->source; $event->setRelation('eventable', $existingModel); dd($event);
方法2:修改Event模型的批量赋值规则
在Event模型中把id加入$fillable数组,允许批量赋值该字段:
class Event extends Model { protected $fillable = ['id', 'source']; }
修改后,原代码即可正常生成包含ID的$event对象。
方法3:使用forceFill强制批量赋值
若不想修改模型的$fillable配置,可通过forceFill方法强制填充字段:
$event = new Event(); $event->forceFill([ 'id' => $existingModel->event->id, 'source' => $existingModel->event->source, ]); $event->setRelation('eventable', $existingModel); dd($event);
内容的提问来源于stack exchange,提问作者Bruno Francisco
相关产品推荐
相关产品推荐

