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
相关产品推荐
相关产品推荐

