【问题标题】:Eliminating Duplicate Queries with Eager Loading使用 Eager Loading 消除重复查询
【发布时间】:2018-06-15 18:25:38
【问题描述】:

我正在尝试消除我网站上不必要的查询,但我正在努力解决急切加载和延迟加载问题。我网站上的所有用户都有列表,列表有多个用户。它们通过表listing_users 连接。然后,每个列表都有一个与之关联的“订单”。这是用户模型:

用户模型:

public function listings(){
   return $this->belongsToMany(Listing::class)->withPivot('role_id');
}

上市模式:

  public function order(){
   return $this->hasOne(Order::class)->first();
  }

我当前的仪表板是通过在 UserController 中调用这个 viewListings 来加载的:

public function viewListings(){
  $user = Auth::user();
  $listings = $user->listings()->orderBy('created_at','desc')->get();
  return view('user.listings', compact('listings'));
}

问题出现在我的刀片视图 user.listings 中,其中每个列表都有一个 foreach 循环,然后也调用每个订单。我需要一种将列表及其相关订单传递到页面的方法。

  @foreach($listings as $listing)
    @if($listing->order()->status == 'completed')
      {{-- Display the listing details here --}}
    @endif
  @endforeach 

对于上述情况的任何建议将不胜感激!我确信有一个我忽略的简单 Laravel 解决方案。

【问题讨论】:

    标签: php laravel eloquent lazy-loading eager-loading


    【解决方案1】:

    试试这个:

    上市模式:

    public function order(){
      return $this->hasOne(Order::class); //without first()
    }
    

    用户控制器: 在这里,我们使用方法with('order') 为通过查询检索到的每个Listing 模型预先加载Order 模型。所以现在在你的刀片中不会有不必要的查询。

    当访问 Eloquent 关系作为属性时,关系 数据是“延迟加载”。这意味着关系数据不是 实际加载,直到您第一次访问该属性。然而,雄辩 可以在查询父模型时“急切加载”关系。

    public function viewListings(){
      $user = Auth::user();
      $listings = $user->listings()->orderBy('created_at','desc')
      ->with('order')->get();//added with('order')
      return view('user.listings', compact('listings'));
    }
    

    user.listings: 如果您需要检索模型,则应使用 order 而不使用 ()。因此,如果您想修改order,请将其与() 一起用作查询构建器,并添加更多约束,例如whereorderBy 等,最后添加first()。 在这里你可以理解为什么我们从上面的hasOne 中删除了first()

    @foreach($listings as $listing)
       @if($listing->order->status == 'completed')
        {{-- order instead of order() --}} 
         {{-- Display the listing details here --}}
       @endif
    @endforeach 
    

    【讨论】:

    • 虽然这应该可行,但它对 OP 和其他搜索解释你在做什么以及它为什么解决问题的人会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2017-09-17
    • 2014-06-09
    • 2011-03-14
    • 2021-12-03
    相关资源
    最近更新 更多