如何在 laravel eloquent 查询中获取前 10 个类别列表
How to get top 10 category list in laravel eloquent query
我有三个table一个是category
table另一个是product
table还有一个product_to_category
table,它只有 product_id
和 category_id
列。
现在我想获得产品数量最多的前 10 个类别,以及每个类别中 10 个产品的详细信息。
我写的是
$result = ProductToCategory::groupBy('category_id')->with(['product',function($q){
$q->take(10);
}])->orderBy('category_id)->take(10);
但这不是 working.How 正确编写此查询
谁能帮忙。泰
模型关系
产品型号
public function category(){
return $this->belongsTo(ProductToCategory::class);
}
对于类别模型
public function products()
{
return $this->hasMany(ProductToCategory::class);
}
对于 ProductToCategory 模型
public function product()
{
return $this->hasMany(Product::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
这里是数据库门面版本:
$tenPopularTags = DB::table('product_to_category')
->join('category', 'product_to_category.category_id', '=', 'category.id')
->select(DB::raw('count(product_to_category.category_id) as repetition, question_tag.tag_id'))
->groupBy('product_to_category.category_id')
->orderBy('repetition', 'desc')->take(10)
->get();
不过我喜欢@Alexey Mezenin 的做法。因为这是更简洁的方式,所以对其进行了一些定制:
$tenCategories = Category::withCount('products')->orderBy('questions_count', 'DESC')->take(10)->get();
在我的项目博客中使用了 post 和类别关系,并且有效!
最有效的方法是使用原始 SQL 查询,因为您无法使用预先加载约束来过滤产品。
但是,如果您仍然想要 Eloquent 解决方案,请定义关系:
在Product
模型中:
public function categories()
{
return $this->belongsToMany(Category::class, 'product_to_category');
}
并且在 Category
模型中:
public function products()
{
return $this->belongsToMany(Product::class, 'product_to_category');
}
那么你将有两个选择,两者各有利弊:
1. 此代码将仅执行 2 个查询,但会使用更多内存。你可以用他们的产品获得前十个类别:
$categories = Category::withCount('products')->latest('products_count')->take(10)->with('products')->get();
然后只保留前十个产品:
$categories->transform(function($category) {
$topProducts = $category->products->take(10);
unset($category->products);
$category->products = $topProducts;
return $category;
});
2. 此解决方案将创建 12 个查询但会节省内存:
$categories = Category::withCount('products')->latest('products_count')->take(10)->get();
$categories->transform(function($category) {
$category->products = Product::whereHas('categories', function($q) use($category) {
$q->where('id', $category->id);
})
->take(10)
->get();
return $category;
});
我有三个table一个是category
table另一个是product
table还有一个product_to_category
table,它只有 product_id
和 category_id
列。
现在我想获得产品数量最多的前 10 个类别,以及每个类别中 10 个产品的详细信息。
我写的是
$result = ProductToCategory::groupBy('category_id')->with(['product',function($q){
$q->take(10);
}])->orderBy('category_id)->take(10);
但这不是 working.How 正确编写此查询 谁能帮忙。泰
模型关系
产品型号
public function category(){
return $this->belongsTo(ProductToCategory::class);
}
对于类别模型
public function products()
{
return $this->hasMany(ProductToCategory::class);
}
对于 ProductToCategory 模型
public function product()
{
return $this->hasMany(Product::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
这里是数据库门面版本:
$tenPopularTags = DB::table('product_to_category')
->join('category', 'product_to_category.category_id', '=', 'category.id')
->select(DB::raw('count(product_to_category.category_id) as repetition, question_tag.tag_id'))
->groupBy('product_to_category.category_id')
->orderBy('repetition', 'desc')->take(10)
->get();
不过我喜欢@Alexey Mezenin 的做法。因为这是更简洁的方式,所以对其进行了一些定制:
$tenCategories = Category::withCount('products')->orderBy('questions_count', 'DESC')->take(10)->get();
在我的项目博客中使用了 post 和类别关系,并且有效!
最有效的方法是使用原始 SQL 查询,因为您无法使用预先加载约束来过滤产品。
但是,如果您仍然想要 Eloquent 解决方案,请定义关系:
在Product
模型中:
public function categories()
{
return $this->belongsToMany(Category::class, 'product_to_category');
}
并且在 Category
模型中:
public function products()
{
return $this->belongsToMany(Product::class, 'product_to_category');
}
那么你将有两个选择,两者各有利弊:
1. 此代码将仅执行 2 个查询,但会使用更多内存。你可以用他们的产品获得前十个类别:
$categories = Category::withCount('products')->latest('products_count')->take(10)->with('products')->get();
然后只保留前十个产品:
$categories->transform(function($category) {
$topProducts = $category->products->take(10);
unset($category->products);
$category->products = $topProducts;
return $category;
});
2. 此解决方案将创建 12 个查询但会节省内存:
$categories = Category::withCount('products')->latest('products_count')->take(10)->get();
$categories->transform(function($category) {
$category->products = Product::whereHas('categories', function($q) use($category) {
$q->where('id', $category->id);
})
->take(10)
->get();
return $category;
});