Laravel中多级查询

时间:2018-12-18 01:45:56

标签: php laravel-5 laravel-5.7

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

产品与用户的关系是ManyToMany。 产品属于类别和类别具有许多产品之间的关系

这就是我做的:

$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());

这样我就可以获取已登录用户的所有类别和所有产品。

谢谢

1 个答案:

答案 0 :(得分:1)

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

使用()种产品加载类别:

Eager Loading Relationships

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

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

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

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();返回与给定用户ID相关联的产品相关联的类别的集合。

更新:使用范围过滤器有条件地热切加载

您仍然希望用户急于加载一个条件,以加载与该用户相关联的所有产品,然后应用上述范围过滤器将返回的类别限制为仅与该用户相关联的类别:

$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()

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