首页 > 解决方案 > 渴望加载 3 个关系?

问题描述

我有这些表:

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 

我怎样才能急于加载查询?

标签: phplaraveleloquent

解决方案


我假设你只想要产品?

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

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

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

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

推荐阅读