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

基于现有模型数据创建内存模型: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:07:14