📅  最后修改于: 2023-12-03 14:59:25.785000             🧑  作者: Mango
在 Laravel 8 中,我们可以使用 JOIN 连接多张表格获取数据,并通过 Aggregation 函数计算出平均评分。下面将介绍如何在 Laravel 8 中使用 JOIN 和 Aggregation 函数从多张表格中获取平均评分。
我们准备使用三张表格来模拟数据。分别是用户表格(users)、商品表格(products)和评分表格(ratings)。表格结构如下所示:
| id | name | |----|----------| | 1 | Alice | | 2 | Bob | | 3 | Charlie |
| id | name | |----|----------| | 1 | iPhone | | 2 | MacBook | | 3 | Watch |
| id | user_id | product_id | rating | |----|---------|------------|--------| | 1 | 1 | 1 | 5 | | 2 | 1 | 3 | 4 | | 3 | 2 | 1 | 3 | | 4 | 2 | 3 | 4 | | 5 | 3 | 1 | 4 | | 6 | 3 | 2 | 5 |
我们需要在用户模型(User)、商品模型(Product)和评分模型(Rating)之间建立关联。找出每个商品的评分,并计算出平均评分。在商品模型中定义 belongsToMany 关联:
class Product extends Model
{
public function ratings()
{
return $this->belongsToMany(Rating::class);
}
}
在评分模型中定义 belongsTo 关联:
class Rating extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function product()
{
return $this->belongsTo(Product::class);
}
}
我们需要在控制器中编写一个方法,用于获取商品平均评分。该方法包含了 JOIN 和 Aggregation 函数。在控制器中定义如下方法:
use Illuminate\Support\Facades\DB;
public function averageRating()
{
return DB::table('products')
->join('product_rating', 'products.id', '=', 'product_rating.product_id')
->select('products.name', DB::raw('AVG(product_rating.rating) as rating_avg'))
->groupBy('products.name')
->get();
}
定义路由,触发控制器方法:
Route::get('/average-rating', [ProductController::class, 'averageRating']);
接口返回结果应如下所示:
| name | rating_avg |
|----------|------------|
| iPhone | 4.0 |
| MacBook | 5.0 |
| Watch | 4.0 |
在 Laravel 8 中,我们可以使用 JOIN 和 Aggregation 函数来连接多张表格并计算出评分均值。通过模型关联我们可以更加方便地操作数据库,代码量也大大减少。希望本文提供了 Laraval 8 中 JOIN 和 Aggregation 函数的最佳实践。