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

