我有一个类别/产品/用户我需要为特定用户获取所有产品的所有类别。我可以为特定用户选择产品,但我不知道如何获得这些产品的所有类别。
产品和用户的关系是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相关联,则将急切地加载该类别的产品。