Laravel/Livewire中with与firstOrFail联用触发空对象调用错误排查
问题排查与修复方案
核心错误原因
触发「Call to a member function with() on null」的根本原因是**Point模型的scopeGetBySlug查询作用域没有正确返回查询构建器实例**,导致后续链式调用with()时调用对象为null。
排查步骤
检查
scopeGetBySlug方法签名:
Laravel查询作用域必须遵循固定规则:- 方法名以
scope开头 - 第一个参数必须是查询构建器实例
$query - 后续参数为自定义参数
错误示例(会导致返回
null):public function scopeGetBySlug($slug) { return $this->where('slug', $slug); }- 方法名以
检查方法返回值:
作用域方法必须返回$query的链式调用结果,不能直接执行first()/get()返回模型实例或集合,否则会中断查询构建器的链式调用。
修复方案
1. 修正查询作用域实现
在Point模型中,将scopeGetBySlug改为正确的查询构建器返回形式:
// app/Models/Point.php public function scopeGetBySlug($query, string $slug) { // 返回查询构建器实例,支持后续链式调用 return $query->where('slug', $slug); }
2. 正确调用查询链
在PointShowPage组件的render方法中,按顺序链式调用作用域、预加载关联、执行查询:
// app/Livewire/PointShowPage.php public function render() { // 假设组件已通过路由/属性获取到$slug变量 $point = Point::getBySlug($this->slug) ->with('creator') ->firstOrFail(); return view('livewire.point-show-page', compact('point')); }
可选优化:在作用域中预加载关联
如果希望getBySlug默认预加载creator关联,可以直接在作用域中添加:
public function scopeGetBySlug($query, string $slug) { return $query->where('slug', $slug)->with('creator'); }
此时组件中只需简化调用:
$point = Point::getBySlug($this->slug)->firstOrFail();
补充:确保slug参数有效
确认Livewire组件已正确获取slug参数:
- 通过路由传递:在路由定义中指定
{slug},组件通过mount方法接收// routes/web.php Route::get('/points/{slug}', \App\Livewire\PointShowPage::class); // PointShowPage.php public function mount(string $slug) { $this->slug = $slug; }
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

