【问题标题】:Eager loading 3 relationships?渴望加载 3 个关系?
【发布时间】:2020-09-05 12:30:08
【问题描述】:

我有这些表:

users | name - ... 
carts | user_id -  ... 
cart_product | cart_id -  product_id 

关系:

Cart model
public function products()
{
    return $this->belongsToMany(Product::class)
                ->withPivot('quantity','coupon_id')
                ->withTimestamps();
}

User model:
public function cart()
{
    return $this->hasOne(Cart::class);
}

当我进行查询时,查询中有 n+1,如下所示:

auth()->user()->cart()->with('products')->products 

如何预先加载查询?

【问题讨论】:

  • user()->with('cart.products')
  • 这样打印dd(auth())会得到什么?让我们知道
  • @EncangCutbray 登录的用户!
  • 试试这样return auth()->loadMissing('cart.products')如果您遇到错误,请告诉我们
  • @EncangCutbray 调用模型 [App\Models\Cart] 上的未定义关系 [cart]。

标签: php laravel eloquent


【解决方案1】:

我假设你只是想要产品?

$products = auth()->user()->cart->products;

这将加载cart 关系,然后是该购物车的products。它不会多次运行这些查询,因为此User 现在已加载其cart 关系(因此通过动态属性访问时不会再次加载)。 Cart 已加载其 products 关系(通过动态属性访问时不会再次加载)。

如果您真的想“延迟加载”这些关系(您必须查看查询是否有任何不同,因为它应该与通过动态属性访问它相同),您可以这样做:

$products = auth()->user()->load('cart.products')->cart->products;

【讨论】:

  • load 和 loadMissing 有什么区别?因为 loadMissing 正在工作,但加载却没有!
  • 这里似乎没有理由需要进行任何延迟加载,所以不知道为什么您认为需要这样做
  • 因为您直接查询关系而不是使用动态属性,并且您在循环中进行一些查询......一旦您拥有该产品集合,除非您这样做,否则没有什么可以再次查询自己查询
  • 你不会在循环中调用load ...一旦加载了它就加载了,为什么还要一遍又一遍地加载它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2014-04-19
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2012-09-08
  • 2016-05-31
相关资源
最近更新 更多