首页 > 解决方案 > Laravel - 试图获取非对象的属性文本

问题描述

这是我之前做过一百万次的事情,所以我真的很困惑为什么会出现这个错误。

在我的Controller中,我获取了一些结果:

$modOfSubchanIDs = Auth::user()->modOf->pluck('id')->toArray();
    
$modmails = ModMail::whereIn('subchan_id', $modOfSubchanIDs)
                ->with('subchan')
                ->with('creator')
                ->with('appeal')
                ->orderBy('created_at', 'desc')
                ->paginate(10);

然后在Blade中,我尝试输出以下关系的结果:

@foreach ($modmails as $modmail)
<div>
    {{$modmail->appeal->text}}
</div>
@endforeach

Modmail型号关系:

public function appeal()
{
    return $this->belongsTo(SubchanBanAppeal::class, 'appeal_id');
}   

但我收到以下错误:

ErrorException 试图获取非对象的属性“文本”

奇怪的。所以我试着

<div>
    {{$modmail->appeal}}
</div>

它在 Blade 中返回以下内容:

{"id":1,"subchan_id":8,"subchan_ban_id":1,"text":"test","denied":0,"created_by":5003,"created_at":"2021-03-26T00: 07:58.000000Z","updated_at":"2021-03-26T00:07:58.000000Z"}

所以现在我真的很困惑。为什么它会正确返回,但当我尝试特定列时却没有?我也尝试过{{$modmail->appeal['text']}},但这会返回

尝试访问 null 类型值的数组偏移量

感觉就像我在这里错过了一些非常基本的东西......

标签: laravel

解决方案


您是否{{ $modmail->appeal }}在循环内进行了调试?很可能大多数人$modmails都有上诉,但一两个人没有。如果它不是第一个丢失的,那么您的测试看起来是正确的。

optional()辅助方法可以在这种情况下提供帮助。

@foreach ($modmails as $modmail)
<div>
    {{ optional($modmail->appeal)->text }}
</div>
@endforeach

https://laravel.com/docs/master/helpers#method-optional


推荐阅读