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

Laravel存储VehicleLog时报Attempt to assign property "key" on null求助

问题原因
  • store方法实例化VehicleLog的逻辑错误:你要新增车辆日志记录,不应该通过VehicleLog::join()->first()的方式获取实例,当数据库中没有符合关联条件的日志记录时,first()会返回null,此时对null对象赋值属性就会触发你遇到的报错。之前新增数据偶尔正常是因为恰好存在符合关联条件的旧记录,一旦没有就会报错。
  • 视图下拉框存在拼写错误:你Staff表的关联键是smsstaff_key,但视图的option值写的是$staffs->smstaff_key,少了一个s,导致提交的员工关联键无效,后续关联查询也会失败。
修复方案

1. 修正控制器store方法逻辑

新增场景直接新建VehicleLog实例即可,不需要用join查询结果来获取实例:

public function store(Request $request)
{
    // 新增场景直接新建实例
    $energy = new VehicleLog();
    $energy->smsstaff_key = $request->input('smsstaff_key');
    $energy->vehicle_id = $request->input('vehicle_id');
    $energy->log_dt = $request->input('log_dt');
    $energy->admin_time = $request->input('admin_time');
    $energy->driving_time = $request->input('driving_time');
    $energy->work_time = $request->input('work_time');
    $energy->jobcard_count = $request->input('jobcard_count');
    $energy->start_odo = $request->input('start_odo');
    $energy->end_odo = $request->input('end_odo');

    $energy->save();
    return redirect('/vmaintenance')->with('success', 'data added');
}

2. 修正视图下拉框拼写错误

把option的value字段名修正为正确的smsstaff_key:

<div>  
    <label>Select Staff</label>
    <select name="smsstaff_key" >
        @foreach($staff as $staffs)
        <option value="{{ $staffs->smsstaff_key }}">{{ $staffs['name'] }}</option>
        @endforeach
    </select>
</div>

(可选优化)给VehicleLog模型加关联关系

不用每次手写join查询,写法更简洁、查询性能更好:

class VehicleLog extends Model
{
    public $timestamps = false;
    protected $table = 'vehicleslog';
    protected $primaryKey = 'id';
    protected $dates = ['date'];
    protected $guarded = ['id'];
    
    use HasFactory;

    // 关联车辆表
    public function vehicle()
    {
        return $this->belongsTo(Vehicle::class, 'vehicle_id');
    }

    // 关联员工表
    public function staff()
    {
        return $this->belongsTo(Staff::class, 'smsstaff_key', 'smsstaff_key');
    }
}

修改后index方法可以直接用预加载查询:

public function index()
{
    $energy = VehicleLog::with(['vehicle', 'staff'])->orderBy('id', 'desc')->paginate(5);
    $cars = Vehicle::get();
    $staff = Staff::all();
    return view('admin.vmaintenance', compact('energy', 'cars', 'staff'));
}

视图层直接通过关联属性取值即可,比如$logItem->vehicle->车牌字段、$logItem->staff->name。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:15:02