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()的主要内容,如果未能解决你的问题,请参考以下文章

为啥json没有做任何事情?

为啥 .catch() 没有做任何事情?

为啥我的模拟鼠标点击没有做任何事情?

React Native WebView onMessage 没有做任何事情

不能用导航栏做任何事情

ListView onItemClickListener 不做任何事情