【问题标题】:Eager loading nested relationships on the Auth::user() facade在 Auth::user() 外观上渴望加载嵌套关系
【发布时间】:2017-08-03 17:16:15
【问题描述】:

我正在尝试从我的用户模型中加载一些关系。场景如下:一个用户可以有多个sales,每个销售可以包含多个items

我在我的模型中设置了以下关系:

用户模型:

// Attach User Sales
public function sales()
{
    return $this->hasMany(\App\Models\Sale::class, 'user_id', 'id');
}

销售模式:

// Attach Items
public function items()
{
    return $this->hasMany(Item::class, 'sale_id', 'id');
}

我可以通过执行以下操作来访问用户销售额:

Auth::user()->sales

然后我可以遍历这些销售以获取销售中的相应商品,如下所示:

@foreach(Auth::user()->sales as $sale)
    {{ dump($sale) }}
    {{ dump($sale->items) }}
@endforeach

但是,这给我带来了N+1 问题。

我希望预先加载嵌套的 items 关系以减少查询大小。

非常感谢任何帮助。

【问题讨论】:

  • Auth::user()->sales->with('items')->get() 它是如何工作的? (如果这不起作用,请尝试在上一个查询中使用 sales() 而不是 sales

标签: php laravel laravel-5.4


【解决方案1】:

编辑

使用Lazy Eager Loading,因为用户已经被获取。对于嵌套关系,请使用dot syntax

试试这个

Auth::user()->load('sales.items');

这将为您提供嵌套结果以进行迭代。

User (object)
  |
  |_ User Sales (Collection)
       |
       |_ Items of each sale (Collection)

【讨论】:

  • @JoshBolton 乐于助人 :-)
  • @JoshBolton 太棒了!
  • 你能帮我解决同样的问题吗?
  • 这是一个很好的问题,但答案似乎很鲁莽。它取决于何时调用,以及何时将加载的关系存储在会话中。如果是这样,切换销售项目将不会为用户更新。
猜你喜欢
  • 2020-05-10
  • 2016-08-18
  • 2016-05-31
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2014-08-30
相关资源
最近更新 更多