我有一个看似愚蠢和疯狂的情况。我有用户的活动日志,我的用户模型中有这种关系:
public function activityLogs()
{
return $this->hasMany(Log::class);
}
非常直接,当我检查所有日志的单个用户对象时,它可以正常工作。所以在一个页面上我只想记录最后一个日志,我需要created_at
日期。加载我运行的用户时
$users = User::with(
[
'activityLogs' => function ($query) {
$query->orderBy('created_at', 'desc')
->limit(1);
}
]
)
并按预期返回最后一个日志。如果我想运行
,我想得到约会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) 试图获取非对象的属性(查看: ROOT_PATH /resources/views/acp/partials/profiles.blade.php)(查看: ROOT_PATH / resources / views / ACP /分音/ profiles.blade.php)
我尝试将activityLogs
作为集合和hasMany对象进行访问。我还尝试将生成的JSON字符串转换回json_decode
,但它仍抱怨不是对象。
为什么呢?为什么我在使用dd
时可以完美地获得该值,但是当我尝试其他任何时,它突然变成了JSON字符串?我尝试使用Google搜索,但无论我尝试使用哪种单词组合,我都会提出有关如何将Eloquent对象转换为JSON的问题和指南,与我想要的相反。
答案 0 :(得分:2)
您需要检查以确保用户有最后一项活动。如果没有任何日志,first()
将返回null。你应该检查循环中是否存在。
@foreach($user as $user)
{{$user->activityLogs->count() > 0 ? $user->activityLogs->first()->created_at : 'User Has No Activity!'}}
@endforeach
或使用刀片的@if/@else
@foreach($user as $user)
@if($user->activityLogs->count() > 0)
{{$user->activityLogs->first()->created_at}}
@else
'User Has No Activity!'
@endif
@endforeach
答案 1 :(得分:0)
你应该有两种方法可以解决这个问题,因为你已经渴望将它加载到一个集合中:
$user->activityLogs->first()->created_at
或
$user->activityLogs[0]->created_at
答案 2 :(得分:0)
我在这里参加聚会迟到了,但问题是您的一个活动日志为空,这就是为什么它对您来说是坏事。我现在遇到了同样的问题并解决了。