雄心勃勃的范围,急切的负担与责任?

时间:2015-04-22 14:37:35

标签: php laravel eloquent laravel-5

好的,我试图设置一个范围,根据hasOne关系中的列限制返回哪些用户。

以下是我的用户模型中的两种方法:

public function scopeHasImage($query)
{
    return $query->with(['profile' => function($query){
        $query->where('avatar', '!=', '');
    }]);
}

public function profile()
{
    return $this->hasOne('App\Profile');
}

当我这样称呼时:

$users = User::HasImage()->simplePaginate(15);

所有这些都可以正常工作,直到我在我的刀片模板中显示代码如下:

            @foreach($users as $user)
            <div class="col-xs-12 col-sm-3 col-md-2">
                <a href="{{ route('user.profile.public', ['id' => $user->id]) }}">
                    <img class="img-responsive" src="{{ $user->profile->avatar }}" />
                </a>
            </div>
            @endforeach

导致此错误:

Trying to get property of non-object

我已经转储了$ user-&gt;个人资料,它是一个列出了属性的对象,其中一个属性是头像。所以我不确定为什么这不起作用。

任何想法都会非常感激。

1 个答案:

答案 0 :(得分:2)

几乎可以肯定,您的某个用户没有附加个人资料。因为你可能只倾倒了第一个$user->profile,你没有看到......

您可以通过将其包装在if:

中来解决此问题
@foreach($users as $user)
    @if($profile = $user->profile)
        <div class="col-xs-12 col-sm-3 col-md-2">
            <a href="{{ route('user.profile.public', ['id' => $user->id]) }}">
                <img class="img-responsive" src="{{ $profile->avatar }}" />
            </a>
        </div>
    @endif
@endforeach

或者首先排除没有个人资料的用户(这可能是你一直想要的)

public function scopeHasImage($query)
{
    return $query->with('profile')->whereHas('profile', function($query){
        $query->where('avatar', '!=', '');
    });
}