eloquent 有限制的急切加载范围?

eloquent scope to eager load with constriant?

好的,所以我正在尝试设置一个范围,该范围将根据 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);

所有这些工作正常,直到我像这样在我的 blade 模板中显示代码:

            @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->profile,它是一个 object,其中列出了属性,其中一个属性是头像。所以我不确定为什么这不起作用。

如有任何想法,我们将不胜感激。

几乎可以肯定您的一位用户没有附加个人资料。因为你可能只丢弃了第一个 $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', '!=', '');
    });
}