在Laravel中查询多级



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

产品和用户的关系是ManyToMany。产品分类To Category和Category之间的关系有许多产品

这是我做的:

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

这样我就可以获得loggedIn用户的所有类别和所有产品。

谢谢你,

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

使用((产品加载类别:

热切的装载关系

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

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

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

查询范围

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相关联,则将急切地加载该类别的产品。

最新更新