Laravel 5.6:新用户登录首页报Trying to get property of non-object错误求助
解决Laravel中首页StatController非对象属性访问错误的问题
嘿,这个问题我做项目时也碰到过类似的,咱们一步步拆解原因和解决方案:
核心差异:空集合 vs Null 对象
首先得搞清楚为啥联系人页面没报错,首页却炸了——这俩处理的空数据类型完全不一样:
- 联系人页面的查询(比如
Contact::all()或者Auth::user()->contacts),没数据时返回的是空集合(EmptyCollection),不管是@foreach遍历还是判断集合是否为空,Laravel都能友好处理,不会触发「非对象属性访问」错误。 - 而你的
StatController第38行的查询,新用户登录时返回的是null(比如Auth::user()->stat,新用户还没生成统计记录),这时候直接访问它的属性(比如$stat->total_visits),就会触发Trying to get property of non-object错误。
可能的具体原因
- 统计逻辑没做空值处理:联系人页面可能用了
@forelse、optional()或者空集合判断,但首页的统计代码直接硬访问属性,完全没考虑查询结果为null的情况。 - 新用户无关联统计数据:统计数据是和用户绑定的(比如
User模型有hasOne(Stat::class)关联),老用户因为有历史操作已经生成了统计记录,但新用户刚注册,还没触发统计记录的创建,导致关联查询返回null。
解决方案
1. 给查询结果加空值保护
最直接的临时修复是用Laravel的optional()辅助函数,或者空安全运算符(Laravel 8+支持)来避免报错:
// 在StatController里 $stat = Auth::user()->stat; $totalVisits = optional($stat)->total_visits ?? 0; // 如果stat是null,返回0 // 或者在Blade视图里用空安全运算符 {{ $stat?->total_visits ?? 0 }}
2. 自动为新用户创建统计记录
从根源解决的话,可以在用户注册成功时自动生成对应的统计记录,这样新用户登录时关联查询就不会返回null了:
// 在User模型中添加创建事件 protected static function booted() { static::created(function ($user) { // 初始化统计数据的默认值 $user->stat()->create([ 'total_users' => 0, 'today_visits' => 0, // 其他统计字段的默认值 ]); }); }
3. 优化查询逻辑,确保返回对象而非null
如果统计数据是全局的,不是用户关联的,可以用firstOrCreate()来确保查询返回对象:
// 在StatController里 $stat = Stat::firstOrCreate( ['type' => 'global'], // 查询条件 ['total_users' => 0, 'today_visits' => 0] // 不存在时创建的默认值 );
4. 参考联系人页面的空数据处理逻辑
看看联系人页面是怎么处理空数据的,比如用@forelse代替@foreach,或者判断集合是否为空:
{{-- 联系人页面的写法示例 --}} @forelse($contacts as $contact) <p>{{ $contact->name }}</p> @empty <p>暂无联系人</p> @endforelse
把类似的判断逻辑套用到首页的统计展示上,比如:
@if($stat) <p>今日访问量:{{ $stat->today_visits }}</p> @else <p>暂无统计数据</p> @endif
内容的提问来源于stack exchange,提问作者LearnLaravel
相关产品推荐
相关产品推荐

