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

时间:2017-06-28 15:03:11

标签: php json laravel eloquent relationships

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

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的问题和指南,与我想要的相反。

3 个答案:

答案 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)

我在这里参加聚会迟到了,但问题是您的一个活动日志为空,这就是为什么它对您来说是坏事。我现在遇到了同样的问题并解决了。