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
我参加这里的聚会迟到了,但问题是您的一个活动日志为空,这就是它为您中断的原因。我现在遇到了同样的问题并解决了。
我有一个看似愚蠢和疯狂的情况。我有 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
我参加这里的聚会迟到了,但问题是您的一个活动日志为空,这就是它为您中断的原因。我现在遇到了同样的问题并解决了。