【问题标题】:eloquent scope to eager load with constriant?雄辩的范围来急切地加载约束?
【发布时间】:2015-04-22 14:37:34
【问题描述】:

好的,所以我正在尝试设置一个范围,该范围将根据 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->profile,它是一个列出了属性的对象,其中一个属性是头像。所以我不确定为什么这不起作用。

任何想法将不胜感激。

【问题讨论】:

  • 您是否尝试确定发生在哪一行错误?
  • 这个错误是由刀片模板中的{{ $user->profile->avatar }}产生的。如果我删除该代码,它会加载所有内容。
  • 尝试转储$users 而不是$user-&gt;profile 以确认是否每个人都有所需的属性。您能否向我们展示一下您在哪里以及如何进行预加载?

标签: php laravel eloquent laravel-5


【解决方案1】:

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

【讨论】:

  • 您的示波器解决了我的问题。为什么将 ->with() 与 ->whereHas 一起使用?我假设限制 ->with() 会将其限制为仅具有设置了头像的个人资料的用户。我猜这只是返回所有用户,如果他们有头像,有些用户可能已经附加了个人资料。
  • with() 是加载关系。 has() 来限制您加载的模型是否具有某种关系。 with() 带有闭包,whereHas() 做同样的事情,但让您过滤相关模型。您所做的只是急切地加载具有头像的配置文件,而不是限制生成的集合。我的回答仍然使用with(),否则 Eloquent 将为您访问的每个用户的个人资料运行一个数据库查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
相关资源
最近更新 更多