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 与用户相关联的产品相关联的类别列表:
加载类别 () 产品:
$products = Product::with('categories')->byUser(auth()->user()->id)->get();
这将 return 已加载相关类别的产品集合,因此您可以调用 $products->first()->categories()->get() 到 return该产品的类别列表。
在类别模型上使用范围过滤器仅列出类别:
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 相关联,则将急切加载该类别的产品。
我有一个类别/产品/用户 我需要为特定用户获取所有产品的所有类别。 我能够为特定用户选择产品,但我不知道如何获取这些产品的所有类别。
产品和用户的关系是多对多的。 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 与用户相关联的产品相关联的类别列表:
加载类别 () 产品:
$products = Product::with('categories')->byUser(auth()->user()->id)->get();
这将 return 已加载相关类别的产品集合,因此您可以调用 $products->first()->categories()->get() 到 return该产品的类别列表。
在类别模型上使用范围过滤器仅列出类别:
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 相关联,则将急切加载该类别的产品。