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

Laravel中save()方法返回属性少于findOrFail()的问题

嘿,我来帮你排查这个问题——看起来你在Laravel里操作Shipment模型时,发现只有部分属性被正确赋值,其他要么是null要么没完整显示?这大概率是批量赋值或者模型属性配置的问题,下面是几个常见的解决方向:

1. 检查模型的批量赋值配置(最常见原因)

Laravel默认会保护模型的批量赋值,只有在模型中声明$fillable的字段才能通过fill()、create()或者直接赋值请求数据的方式被赋值。你需要在Shipment模型里添加允许批量赋值的字段列表:

class Shipment extends Model
{
    // 列出所有需要通过请求赋值的字段
    protected $fillable = [
        'pro_number', 'shipment_origin', 'date', 'due_date',
        'tractor_id', 'trailer_id', 'driver_id', 'notes',
        // 这里补充你需要的其他字段
    ];
}

如果你想允许所有字段批量赋值(不推荐,安全性较低),可以用$guarded设置为空数组:

protected $guarded = [];

2. 确认请求中是否真的包含这些字段

有时候不是模型的问题,而是前端根本没传tractor_id、driver_id这些字段的值。你可以在赋值前先打印请求的所有数据,确认是否有这些字段:

dd(request()->all()); // 看看输出里有没有tractor_id、driver_id等字段

如果请求里就没有这些值,那模型里自然是null。

3. 检查模型的$hidden属性

如果你的Shipment模型里设置了$hidden属性,这些字段会在序列化(比如dd、返回JSON)时被隐藏。检查一下模型里有没有类似这样的代码:

// 如果你不需要隐藏这些字段,把它们从$hidden里移除
protected $hidden = ['tractor_id', 'trailer_id', 'driver_id'];

4. 修正save()的调用方式

另外注意,你写的$shipment = Shipment::save();是错误的——save()是模型实例的方法,不是静态方法。正确的使用方式应该是:

// 方式一:实例化后填充再保存
$shipment = new Shipment();
$shipment->fill(request()->all()); // 这里依赖$fillable配置
$shipment->save();
dd($shipment);

// 方式二:直接用create静态方法(会自动保存)
$shipment = Shipment::create(request()->all());
dd($shipment);

按照上面的步骤排查,应该就能解决只有部分属性显示的问题了。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:52:43