Laravel多级查询

Query of multi level in Laravel

我有一个类别/产品/用户 我需要为特定用户获取所有产品的所有类别。 我能够为特定用户选择产品,但我不知道如何获取这些产品的所有类别。

产品和用户的关系是多对多的。 product belongsTo Category与Category hasMany Products的关系

这是我做的:

$products = Product::byUser(auth()->id())->get();

public function scopeByUser(Builder $query)
{
    return $query->whereHas('users', function ($q) {
        $q->where('id', auth()->id());
    });
}

但我无法做到:

$products = Category::productsByUser(auth()->id());

这样我就可以得到登录用户的所有分类和所有产品。

谢谢,

您可以在单个查询中加载包含产品的类别,以获取与用户关联的产品列表。或者,您可以在类别模型上创建一个范围过滤器,以 return 与用户相关联的产品相关联的类别列表:

加载类别 () 产品:

Eager Loading Relationships

$products = Product::with('categories')->byUser(auth()->user()->id)->get();

这将 return 已加载相关类别的产品集合,因此您可以调用 $products->first()->categories()->get() 到 return该产品的类别列表。

在类别模型上使用范围过滤器仅列出类别:

Query Scopes

public function scopeByUser(Builder $query, $user_id)
{
    return $query->whereHas('products', function ($q) use($user_id) {
        $q->whereHas('user', function ($q) use($user_id){
            $q->where('id', $user_id);
        }
    });
}

然后就可以运行 Category::byUser(auth()->user()->id)->get(); return 与给定用户 ID 相关联的产品相关联的类别集合。

更新:使用范围过滤器进行条件预加载

您仍然希望用户预先加载有条件加载与用户关联的所有产品,然后应用上述范围过滤器将类别限制为仅与用户关联的类别 return :

$user_id = auth()->user()->id;
$categories = Category::with(['products'=> function($q) use($user_id){
    $q->whereHas('user',function($q) use($user_id){
        $q->where('id',$user_id);
    });
}])->byUser($user_id)->get()

这将 return 与产品相关联的类别集合,这些产品与所提供的用户 ID 相关联,并且如果这些产品与所提供的用户 ID 相关联,则将急切加载该类别的产品。