Laravel获取非对象属性报错问题求助
解决 "Trying to get property 'nameP' of non-object" 报错
嘿,我一眼就揪出问题所在了——你碰到的这个错误,本质就是你通过DB查询得到的$sub变量是null,空值当然没法访问nameP属性啦!
为什么会出现这个问题?
你看你的代码逻辑:你先拿Hour::latest()->first()->id + 1生成了一个$id,接着就用这个还没被创建的Hour ID去关联查询projects表的nameP,但这时候你还没执行Hour::create()啊!实际请求时,这个ID对应的Hour记录根本还没写入数据库,所以你的查询自然拿不到数据,$sub就成了null。
至于Laravel Tinker里能正常跑,那是因为你之前可能手动创建过对应ID的Hour记录,刚好匹配上了查询条件,属于巧合而已。
修复方案(两种可选,推荐第一种)
方案一:用Eloquent关联(最符合Laravel风格)
先给你的Hour模型加个和Project的关联关系:
// app/Models/Hour.php public function project() { return $this->belongsTo(Project::class); }
然后修改你的store方法,逻辑更简洁安全:
public function store(Request $request) { // 先把Hour记录写入数据库 $hour = Hour::create([ 'id' => $request->hour_id, 'project_id' => $request->project_id, 'day' => $request->day, 'nHours' => $request->nHours, 'notesH' => $request->notesH ]); // 通过关联直接拿项目名称,不用写复杂的DB查询 $name = $hour->project->nameP; return response()->json([$hour, 'nameP' => $name]); }
方案二:调整执行顺序(不用关联的话)
如果你暂时不想加模型关联,那就把创建记录的步骤放到查询前面,并且用刚创建的Hour的真实ID去查询:
public function store(Request $request) { // 先创建Hour记录 $hour = Hour::create([ 'id' => $request->hour_id, 'project_id' => $request->project_id, 'day' => $request->day, 'nHours' => $request->nHours, 'notesH' => $request->notesH ]); // 用刚生成的hour id去做关联查询 $sub = DB::table('hours') ->join('projects', 'hours.project_id', '=', 'projects.id') ->where('hours.id', '=', $hour->id) ->select('nameP') ->first(); // 加个空安全处理,避免再次出现类似报错 $name = $sub?->nameP ?? '未找到项目名称'; return response()->json([$hour, 'nameP' => $name]); }
额外小建议
- 尽量别手动指定
id,Laravel默认的自增ID会自动处理,手动指定很容易出现ID冲突的问题; - 以后碰到类似的“非对象属性访问”错误,第一时间检查对应的变量是不是null,大概率是查询没返回数据导致的。
内容的提问来源于stack exchange,提问作者Luana Mantovan
相关产品推荐
相关产品推荐

