Laravel使用Yajra Datatables获取bus_code时报非对象属性错误
错误原因
该报错本质是Schedule模型与BusTransport的关联查询返回了null,访问null对象的bus_code属性触发异常。
核心问题为Laravel belongsTo关联的默认外键规则与实际表字段不匹配:
- Laravel
belongsTo关联默认会将关联方法名转为蛇形后拼接_id作为外键字段名,你的关联方法命名为busTransport,默认会匹配bus_transport_id作为外键,但schedule表中存储车辆关联的字段为bus_id,因此关联查询找不到对应数据返回空。 - 其余
Trip、BusConductor关联正常是因为刚好符合默认规则:关联方法名trip对应外键trip_id、关联方法名busConductor转蛇形为bus_conductor对应外键bus_conductor_id,字段完全匹配因此查询正常。
解决方案
- 修正关联定义:在Schedule模型的
busTransport关联中手动指定外键为bus_id
// app/Models/Schedule.php public function busTransport(){ return $this->belongsTo(BusTransport::class, 'bus_id'); }
- 增加空值兼容处理:避免后续因数据缺失(如关联记录被删除)再次触发同类报错,修改控制器中
bus_code字段的返回逻辑:
// Schedule Controller ->addColumn('bus_code', function($row){ // 关联为空时返回默认提示,不会报错 return optional($row->busTransport)->bus_code ?? '未分配车辆'; // PHP 8.0+ 也可以用null安全运算符写法 // return $row->busTransport?->bus_code ?? '未分配车辆'; })
内容的提问来源于stack exchange,提问作者Say Jack
相关产品推荐
相关产品推荐

