Laravel Eloquent 关系在做任何事情时不是一个对象,但 dd()
Posted
技术标签:
【中文标题】Laravel Eloquent 关系在做任何事情时不是一个对象,但 dd()【英文标题】:Laravel Eloquent relationship not an object when doing anything but dd() 【发布时间】:2017-12-02 00:56:46 【问题描述】:我有一个看似愚蠢和疯狂的情况。我有用户的活动日志,我的用户模型中有这种关系:
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
它只是给了我错误
错误异常 (E_ERROR) 试图获取非对象的属性(查看:ROOT_PATH/resources/views/acp/partials/profiles.blade.php)(查看:ROOT_PATH/resources/views/ acp/partials/profiles.blade.php)
我尝试将activityLogs
作为集合和hasMany 对象访问。我还尝试使用json_decode
将生成的 JSON 字符串转换回来,但它仍然抱怨不是对象。
为什么?为什么我在使用dd
时可以很好地得到这个值,但是当我尝试 anything else 时,它突然变成了一个 JSON 字符串?我试过用谷歌搜索这个,但无论我尝试什么单词组合,它都会提出关于如何将 Eloquent 对象转换为 JSON 的问题和指南,这与我想要的相反。
【问题讨论】:
从我在这里看到的答案Laravel HasMany 你试过 $user->activityLogs->first()->created_at
是的,我也试过了。
您已经使用with
加载了活动日志,因此您无需执行所有这些操作。尝试查看您的$user
的转储,看看活动日志是否在其中。
您是否尝试从 foreach 中删除 first(),因为您已经将其拉入
@aynber 是的,预期的信息就在那里。
【参考方案1】:
您需要检查以确保用户有最后一个活动。如果没有任何日志,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
【讨论】:
确实如此,这是我在使用dd($->activityLogs->first())
时看到的,它显示了正确的记录。
这只是第一个用户,但您正在循环访问一组用户,并且该集合中的一个用户(不是第一个用户)没有任何活动日志。
当然,我之前怎么没想到。谢谢。【参考方案2】:
应该有两种方法可以实现,因为您已经迫不及待地将它加载到集合中:
$user->activityLogs->first()->created_at
或
$user->activityLogs[0]->created_at
【讨论】:
我已经尝试过了,我得到了Trying to get property of a non-object
。由于某种原因,Log 对象已转换为 JSON 字符串。你也不能使用$user->activityLogs[0]
,因为它是一个 Laravel 集合,而不是一个数组。
我在本地尝试过,它成功了,但我使用的是旧版本的 Laravel,这会有所作为。 耸耸肩
感谢您至少尝试:)。【参考方案3】:
我在这里参加聚会迟到了,但问题是您的一个活动日志为空,这就是它对您造成影响的原因。我现在遇到了同样的问题并想通了。
【讨论】:
以上是关于Laravel Eloquent 关系在做任何事情时不是一个对象,但 dd()的主要内容,如果未能解决你的问题,请参考以下文章