Laravel Eloquent 除了 dd() 之外,关系不是对象

Laravel Eloquent relationship not an object when doing anything but dd()

我有一个看似愚蠢和疯狂的情况。我有 activity 用户日志,我的用户模型中有这种关系:

public function activityLogs()
{
    return $this->hasMany(Log::class);
}

非常简单,当我检查单个用户对象的所有日志时,它工作正常。所以在一页上我只想记录最后一条日志,我需要它的 created_at 日期。加载用户时我 运行

$users = User::with(
    [
        'activityLogs' => function ($query) {
            $query->orderBy('created_at', 'desc')
                  ->limit(1);
        }
    ]
)

这 returns 是预期的最后一个日志。当我想获取日期时 运行

dd($users->first()->activityLogs()->first()->created_at->format("d/m/Y"));

我得到了一个带有预期日期的字符串输出。但是,当我尝试用它做任何其他事情时,例如将它放入变量或将其回显出来,我只会收到 activityLogs()->first() 不是对象的错误。在我看来(在 foreach ($users as $user) 循环内)的代码是

{{ $user->activityLogs()->first()->created_at }}

它只是给我错误

ErrorException (E_ERROR) Trying to get property of non-object (View: ROOT_PATH/resources/views/acp/partials/profiles.blade.php) (View: ROOT_PATH/resources/views/acp/partials/profiles.blade.php)

我试过将 activityLogs 作为集合和 hasMany 对象访问。我也试过将结果 JSON 字符串转换回 json_decode 但它仍然抱怨不是一个对象。

为什么?为什么我在使用 dd 时可以获得完美的值,但当我尝试 其他任何东西时 它突然变成了 JSON 字符串?我试过用谷歌搜索这个,但无论我尝试什么样的单词组合,它只会提出关于如何将 Eloquent 对象转换为 JSON 的问题和指南,这与我想要的相反。

应该有两种方法可以解决这个问题,因为您已经迫不及待地将它加载到集合中了:

$user->activityLogs->first()->created_at

$user->activityLogs[0]->created_at

您需要检查以确保用户有最后一个 activity。如果没有任何日志,first() 将 return 为 null。您应该检查循环中是否存在。

@foreach($user as $user)
    {{$user->activityLogs->count() > 0 ? $user->activityLogs->first()->created_at : 'User Has No Activity!'}}
@endforeach

或者使用blade的@if/@else

@foreach($user as $user)
    @if($user->activityLogs->count() > 0)
        {{$user->activityLogs->first()->created_at}}
    @else 
        'User Has No Activity!'
    @endif  
@endforeach

我参加这里的聚会迟到了,但问题是您的一个活动日志为空,这就是它为您中断的原因。我现在遇到了同样的问题并解决了。